对于以毫秒为单位的给定历元时间,建议如何在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日期库。
您应该能够截断和Instant
到当天。从javadoc
截断即时语句返回一个带有字段的原始副本小于设置为零的指定单位。
使用ChronoUnit.Days
,您可以将小时、分钟、秒、毫秒归零。
Instant.ofEpochMilli(date).truncatedTo(ChronoUnit.DAYS).toEpochMilli();
由于都是UTC,所以请执行millis/86400_000 * 86400_000
;
long(int)除法将截断为days, * msecs/day将返回为msecs。
如果需要,你可以截断到周,小时或任何你想要的
你有什么作品,但如果你正在寻找一些更可读的东西,如何使用日历?
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();
}
其他答案似乎太辛苦了。
我使用调用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 - 26 t00:00z
millisecondsSinceEpoch: 1443225600000
我使用了一个真正可读的解决方案:
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()));