以毫秒为单位获取以毫秒为单位的午夜纪元时间

时间:2015-09-25 17:53:19

标签: java java-8

以毫秒计算给定纪元时间的UTC午夜时间的建议方法是什么?我尝试了以下似乎有效的方法,想知道是否有更好/更清洁的方法来做同样的事情。

 public long toUtcMidnight(final Long date) {
    return LocalDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneId.of("UTC"))
            .toLocalDate()
            .atStartOfDay()
            .toInstant(ZoneOffset.UTC)
            .toEpochMilli();
    }

我们可以使用Joda时间,但我想只使用java 8日期库。

5 个答案:

答案 0 :(得分:4)

你应该能够截断 Instant到当天。来自javadoc

  

截断瞬间会返回带有字段的原始副本   小于指定的单位设置为零。

使用ChronoUnit.Days,您可以将小时,分钟,秒,毫秒归零。

例如

Instant.ofEpochMilli(date).truncatedTo(ChronoUnit.DAYS).toEpochMilli();

答案 1 :(得分:0)

你有什么作品,但如果你正在寻找更具可读性的东西,那么使用日历呢?

 public long toUtcMidnight(long date) {
      Calendar cal = Calendar.getInstance();
      cal.setTimeInMillis(date);
      cal.setTimeZone(TimeZone.getTimeZone("UTC"));
      cal.set(Calendar.HOUR_OF_DAY, 0);
      cal.set(Calendar.MINUTE, 0);
      cal.set(Calendar.SECOND, 0);
      cal.set(Calendar.MILLISECOND, 0);
      return cal.getTimeInMillis();   
 }

答案 2 :(得分:0)

因为所有UTC都是millis/86400_000 * 86400_000;

long(int)除法将截断为几天,而* msecs / day将把它缩回到msecs。

如果需要,你可以截断几周,几小时或任何你想要的东西。

答案 3 :(得分:0)

其他答案似乎过于努力。

我使用调用atStartOfDay的方法,因为我会在任何时区使用它。某些区域中某一天的第一时刻总是00:00:00.0。这种方法也适用于UTC。

ZonedDateTime midnightUtc = LocalDate.now( ZoneOffset.UTC ).atStartOfDay( ZoneOffset.UTC );
long millisecondsSinceEpoch = midnightUtc.toInstant().toEpochMilli();

转储到控制台。

System.out.println( "midnightUtc: " + midnightUtc );
System.out.println( "millisecondsSinceEpoch: " + millisecondsSinceEpoch );

跑步时。

  

midnightUtc:2015-09-26T00:00Z

     

millisecondsSinceEpoch:1443225600000

答案 4 :(得分:0)

这是我使用的一个非常易读的解决方案:

long fullMsecs = System.currentTimeMillis();
long days = TimeUnit.MILLISECONDS.toDays(msecs);
long truncatedMsecs = TimeUnit.DAYS.toMillis(days);

或缩写:

long msecs = TimeUnit.DAYS.toMillis(
                TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis()));