Mar*_*rco 110 java time timestamp date
我有一个包含日期和时间信息的Java Date对象.我想写一个方法来切断时间信息,截断小时 - 分钟 - 秒,所以我只剩下日期.
输入示例:
2008-01-01 13:15:00
Run Code Online (Sandbox Code Playgroud)
预期产量:
2008-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
你有小费吗?我尝试过这样的事情:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)
但是我遇到了时区的问题.
cle*_*tus 168
该建议的方式做日期/时间操作是使用Calendar
对象:
Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
Run Code Online (Sandbox Code Playgroud)
A_M*_*A_M 138
你看过Apache Commons Lang 中的DateUtils truncate方法吗?
Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);
Run Code Online (Sandbox Code Playgroud)
将删除时间元素.
Bri*_*new 41
你看过Joda吗?这是一种更简单,更直观的方式来处理日期和时间.例如,您可以在(例如)LocalDateTime和LocalDate对象之间进行简单的转换.
例如(以说明API)
LocalDate date = new LocalDateTime(milliseconds).toLocalDate()
Run Code Online (Sandbox Code Playgroud)
此外,它解决了日期/时间格式化程序的一些线程安全问题,强烈建议使用Java中的任何日期/时间问题.
Ada*_*rry 28
根据Java 8及更高版本中内置的java.time类,快速更新.
LocalDateTime
有一种truncatedTo
方法可以有效地解决你在这里谈论的内容:
LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)
Run Code Online (Sandbox Code Playgroud)
这将仅将当前时间表示为分钟:
2015-03-05T11:47
Run Code Online (Sandbox Code Playgroud)
您可以使用任何ChronoUnit
(或实际上任何TemporalUnit
)执行截断.
jit*_*ter 26
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();
Run Code Online (Sandbox Code Playgroud)
h7r*_*h7r 22
使用Joda,您可以轻松获得预期日期.
从版本2.7(可能是因为某些以前的版本大于2.2),作为一个评论者注释,toDateMidnight
已被弃用赞成或恰当命名withTimeAtStartOfDay()
,使得方便
DateTime.now().withTimeAtStartOfDay()
Run Code Online (Sandbox Code Playgroud)
可能.
益处添加了一种更好的API.
对于旧版本,您可以这样做
new DateTime(new Date()).toDateMidnight().toDate()
Run Code Online (Sandbox Code Playgroud)
对于时间戳:
timestamp -= timestamp % (24 * 60 * 60 * 1000)
Run Code Online (Sandbox Code Playgroud)
我用新的java8 API进行了截断.我遇到了一个奇怪的事情,但总的来说它是截断的......
Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
Run Code Online (Sandbox Code Playgroud)
小智 6
使用Apache中的DateUtils,使用truncate,如下所示:
DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
Run Code Online (Sandbox Code Playgroud)
只是clear()
多余的字段。
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();
Run Code Online (Sandbox Code Playgroud)
从 Java 8 开始,更好的选择是使用truncatedTo
方法LocalDateTime
,例如:
LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
Run Code Online (Sandbox Code Playgroud)
从java.util.Date JavaDocs:
Date类表示特定的时间瞬间,精度为毫秒
并从java.sql.Date JavaDocs中获取:
为了符合SQL DATE的定义,必须通过将与实例相关联的特定时区中的小时,分钟,秒和毫秒设置为零,来“标准化” java.sql.Date实例包装的毫秒值。 。
因此,最好的方法是在不需要时间的情况下使用java.sql.Date
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)
输出为:
java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date : 2012-04-26
Run Code Online (Sandbox Code Playgroud)
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
Run Code Online (Sandbox Code Playgroud)
2008-01-01T00:00+01:00[欧洲/巴黎]
要以所需格式生成字符串,请传递DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
Run Code Online (Sandbox Code Playgroud)
2008-01-01 00:00:00
其他答案是正确的,但使用现在已被 java.time 框架过时的旧日期时间类。
java.time 框架内置于 Java 8 及更高版本中。许多 java.time 功能向后移植到 Java 6 & 7 ( ThreeTen-Backport ) 并进一步适应 Android ( ThreeTenABP )。
首先更改输入字符串以符合 ISO 8601 格式的规范版本。默认情况下,在 java.time 类中使用标准ISO 8601格式来解析/生成表示日期时间值的字符串。我们需要用T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // ? 2008-01-01T13:15:00
Run Code Online (Sandbox Code Playgroud)
现在我们可以将其解析为 a LocalDateTime
,其中“Local”表示没有特定的位置。输入缺少任何UTC 偏移量或时区信息。
LocalDateTime ldt = LocalDateTime.parse( input );
Run Code Online (Sandbox Code Playgroud)
ldt.toString()… 2008-01-01T13:15:00
如果您不关心时间或时区,则转换为LocalDate
.
LocalDate ld = ldt.toLocalDate();
Run Code Online (Sandbox Code Playgroud)
ld.toString()… 2008-01-01
相反,如果您希望将时间设置为当天的第一时刻,请使用ZonedDateTime
类,然后转换为LocalDate
对象以调用其atStartOfDay
方法。请注意,00:00:00
由于夏令时或其他异常情况,第一时刻可能不是时间。
时区至关重要,因为在任何给定时刻,世界各地的日期都会因时区而异。例如,巴黎午夜过后的几分钟对巴黎人来说是新的一天,但在蒙特利尔对加拿大人来说仍然是“昨天”。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
Run Code Online (Sandbox Code Playgroud)
zdtStartOfDay.toString()... 2008-01-01T00:00:00-05:00[美国/蒙特利尔]
要通过UTC时区的镜头看到那一刻,请提取一个Instant
对象。无论是ZonedDateTime
和Instant
将代表时间轴上同一时刻,但显示为两个不同的挂钟时间。
AnInstant
是 java.time 中的基本构建块类,根据定义始终使用 UTC。经常使用此类,因为您通常应该在 UTC 中进行业务逻辑、数据存储和数据交换。
Instant instant = zdtStartOfDay.toInstant();
Run Code Online (Sandbox Code Playgroud)
Instant.toString()... 2008-01-01T05:00:00Z
我们看到的是凌晨 5 点,而不是午夜。在标准格式中,Z
末尾是Zulu
“UTC”的缩写,意思是“UTC”。
该java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*
从哪里获得 java.time 类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。