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

问题描述:

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

任何有空间在你的问题有点解释。我建议:

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的ZonedDateTime:59:59.999 + 02:00 [欧洲/柏林。

请注意,一天结束依赖时区,所以你需要决定一个时区的操作。请填写您想要的时区而不是ZoneId.systemDefault()

由于Java不包含“每日结束”操作,因此我选择添加一天,在相关时区采取一天的开始时间,然后减去1毫秒(因为您要求的时间为毫秒时代)。例如,如果你愿意,你可以减去一纳秒,一秒或一分钟。如果你想减去一整分钟,最简单的方法是在toInstant()之前使用.minusMinutes(1)

的代码应该是安全的,即使在白天和在一个夏天的时间过渡(DST转换)发生在午夜时区。

半开

看起来像你的问题涉及确定一天中的最后一刻。这样的目标是不明智的。

这一天的最后时刻是作为第二的分数无限可分的,如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

todayStart:2017-07-19T00:00-04:00 [美国/蒙特利尔]

millisecondsSinceEpoch:1500436800000

翌日(明天),添加一个天到LocalDate

LocalDate tomorrow = today.plusDays(1) ; 
ZonedDateTime tomorrowStart = tomorrow.atStartOfDay(z) ; 

我不能完全确定具体的日期如何发挥成这样了,但如果你想找到当天的最后一个毫秒,我会用LocalTime.MAX.toNanoOfDay()/1000000。这需要一天的最大纳秒,然后除以1000000来转换为毫秒。如果您想将此与日期结合使用,我会将此值与LocalDate或LocalDateTime值结合使用。