如何在Java中以毫秒为单位获取当前日期的最大时间值? 例如。 7月18日23.59,以纪元为单位,当前时间为7月18日。
答案 0 :(得分:2)
您的问题中有一些解释空间。我建议:
ZoneId zone = ZoneId.systemDefault();
long endOfDay = LocalDate.now(zone)
.plusDays(1)
.atStartOfDay(zone)
.toInstant()
.minusMillis(1)
.toEpochMilli();
System.out.println(endOfDay);
在我的电脑上打印
1500501599999
这相当于2017-07-19T23:59:59.999 + 02:00 [欧洲/柏林]的ZonedDateTime
。
请注意,当天结束时间取决于时区,因此您需要确定操作的时区。请填写所需的时区,而不是ZoneId.systemDefault()
。
由于Java不包含“一天结束”操作,我选择添加一天,在当前时区的某个时段开始,然后减去1毫秒(因为你问了自纪元以来的毫秒数)。如果需要,您可以改为减去纳秒,秒或分钟。如果您想减去整分钟,最简单的方法是在.minusMinutes(1)
之前使用toInstant()
。
代码应该是安全的,即使是在夏天时间转换(DST转换)发生在午夜的一天和时区。
答案 1 :(得分:2)
好像你的问题涉及确定当天的最后一刻。这样的目标是不明智的。
一天中的最后一刻可以无限分割,如2017-01-23T23:59:59.999Z。但是,在解析此类日期时间值时,不同的软件使用不同的粒度。旧的旧日期时间类是Java使用毫秒,或3个小数位。新的java.time类使用纳秒或9位小数。其他软件如Postgres数据库使用微秒,小数点后6位。其他软件使用其他分辨率,如5位小数。因此,您将在同一日期的不同场景中获得不同的值。
定义时间跨度的更好方法通常用于日期时间工作,并避免了最后时刻的这种模糊性:半开放。在这种方法中,开头是包含,而结尾是独占。因此,一个完整的一天从一个日期的第一个时刻开始并且一直运行,但不包括第二天的第一个时刻。对于UTC,这将是2017-01-23T00:00:00Z
到2017-01-24T00:00:00Z
。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
ZonedDateTime todayStart = today.atStartOfDay( z ) ;
long secondsSinceEpoch = todayStart.toEpochSecond() ; // Whole seconds since epoch of 1970-01-01T00:00:00Z.
long millisecondsSinceEpoch = todayStart.toInstant().toEpochMilli() ; // Milliseconds since epoch of 1970-01-01T00:00:00Z.
请参阅此code run live at IdeOne.com。
今天开始:2017-07-19T00:00-04:00 [美国/蒙特利尔]
millisecondsSinceEpoch:1500436800000
对于第二天(明天),请在LocalDate
添加一天。
LocalDate tomorrow = today.plusDays( 1 ) ;
ZonedDateTime tomorrowStart = tomorrow.atStartOfDay( z ) ;
答案 2 :(得分:0)
我不完全确定具体日期是如何发挥作用的,但如果你想找到当天的最后一毫秒,我会使用LocalTime.MAX.toNanoOfDay()/1000000
。这需要一天的最大纳秒,然后除以1000000转换为毫秒。如果你想将它与日期结合起来,我会将这个值与LocalDate或LocalDateTime值结合起来。