如何在Java中以毫秒为单位获取当前日期的最大时间值?

时间:2017-07-19 17:02:06

标签: java date time

如何在Java中以毫秒为单位获取当前日期的最大时间值? 例如。 7月18日23.59,以纪元为单位,当前时间为7月18日。

3 个答案:

答案 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:00Z2017-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值结合起来。