以毫秒为单位获取以毫秒为单位的午夜纪元时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以毫秒为单位获取以毫秒为单位的午夜纪元时间相关的知识,希望对你有一定的参考价值。
在毫秒的给定纪元时间内以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();
另一答案
你有什么工作,但如果你正在寻找更具可读性的东西,那么使用Calendar会如何?
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();
}
另一答案
因为它是所有UTC只做millis/86400_000 * 86400_000
;
long(int)除法将截断为天,而* msecs / day将其返回到msecs。
如果需要,你可以截断几周,几小时或任何你想要的东西。
另一答案
其他答案似乎工作太辛苦了。
我使用调用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
另一答案
这是我使用的一个非常易读的解决方案:
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()));
以上是关于以毫秒为单位获取以毫秒为单位的午夜纪元时间的主要内容,如果未能解决你的问题,请参考以下文章