我想要获取当前年月日的毫秒数。但是当我使用以下代码:
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
currentDate = cal.getTimeInMillis();
我仍然可以获取带有小时的毫秒时间。如何解决这个问题?
我想要获取当前年月日的毫秒数。但是当我使用以下代码:
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
currentDate = cal.getTimeInMillis();
我仍然可以获取带有小时的毫秒时间。如何解决这个问题?
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();
在处理日历时,要注意时区。
如果你只关注与GMT相关的时间,并且只需要毫秒级别的精度,那么你可以使用以下代码:
long now = System.currentTimeMillis();
long today = now - now % 86400000;
来自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);
可能还需要设置上午/下午
LocalDate.now()
LocalDate
如果你只需要日期而不是时间,可以使用LocalDate
类。
LocalDate
类表示仅包含日期而没有时间和时区的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期因时区而异。例如,在法国巴黎的午夜后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。
请以大陆/地区
的格式指定一个正确的时区名称,例如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。绝不要使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。
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.
Instant
对象。Instant instant = zdt.toInstant();
避免使用麻烦的旧日期时间类,例如 Calendar
。这些已经被 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 可能未来增加内容的试验场。您可能会在此处找到一些有用的类,例如 Interval
、YearWeek
、YearQuarter
和 更多。
.reset()
和.set(0)
的作用不同。使用reset()
时,必须同时重置HOUR_OF_DAY
和HOUR
才能达到相同的结果。 - Pavel Vlasov