Java日历获取当前日期,精确到毫秒,但不包括小时、分钟、秒钟和毫秒。

25

我想要获取当前年月日的毫秒数。但是当我使用以下代码:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
currentDate = cal.getTimeInMillis();

我仍然可以获取带有小时的毫秒时间。如何解决这个问题?

5个回答

64
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
currentDate = cal.getTimeInMillis();

在处理日历时,要注意时区。


在安卓上它给了我昨天(午夜)。 - Anthony
1
你有照顾好自己的时区吗,@Anthony? - Fred
请注意,.reset().set(0) 的作用不同。使用 reset() 时,必须同时重置 HOUR_OF_DAYHOUR 才能达到相同的结果。 - Pavel Vlasov

9

如果你只关注与GMT相关的时间,并且只需要毫秒级别的精度,那么你可以使用以下代码:

long now = System.currentTimeMillis();
long today = now - now % 86400000;

5

来自javadoc: HOUR_OF_DAY、HOUR和AM_PM字段独立处理,并应用于时间的分辨率规则。清除这些字段中的一个并不会重置日历的小时值。使用set(Calendar.HOUR_OF_DAY, 0)来重置小时值。

cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

可能还需要设置上午/下午


1
上午/下午 - 这就是为什么你要使用Calendar.HOUR_OF_DAY,就像另一个例子所做的那样。 - Mifune

5

简而言之

LocalDate.now()

LocalDate

如果你只需要日期而不是时间,可以使用LocalDate类。

LocalDate类表示仅包含日期而没有时间和时区的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期因时区而异。例如,在法国巴黎的午夜后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。

请以大陆/地区的格式指定一个正确的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。绝不要使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

ZonedDateTime

如果你想要一个日期,其时间设置为当天的第一时刻,请让 java.time 帮助你确定该时刻。不要假设第一时刻是在 00:00:00。由于夏令时等异常情况,第一时刻可能发生在其他时间,如 01:00:00。

使用那个时区对象,即 ZoneId,生成一个 ZonedDateTime 对象。

ZonedDateTime zdt = today.atStartOfDay( z );  // Determine the first moment of the day on this date for this time zone.

要将此时刻作为UTC值查看,请提取一个Instant对象。
Instant instant = zdt.toInstant();

避免使用过时的日期时间类

避免使用麻烦的旧日期时间类,例如 Calendar。这些已经被 java.time 类所取代,现在被视为过时。


关于java.time

java.time框架是Java 8及以上版本内置的。这些类取代了麻烦的旧遗留日期时间类,如java.util.Date, Calendar, 和SimpleDateFormat

Joda-Time项目现已进入维护模式,建议迁移到java.time类。

了解更多,请参阅Oracle教程。在Stack Overflow上搜索许多示例和说明。规范是JSR 310

如何获取java.time类?

ThreeTen-Extra 项目扩展了 java.time 库,提供了额外的类。该项目是 java.time 可能未来增加内容的试验场。您可能会在此处找到一些有用的类,例如 IntervalYearWeekYearQuarter更多


3

如果你想使用Joda time:

   long millis = new DateMidnight().getMillis();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接