这是一个简单的问题,但我对答案可能有多复杂感到紧张。
我想在我的应用程序中知道自该纪元以来已经过去了多少小时。更具体地说,我想知道“自纪元以来有多少次 GMT 时钟以 :00 结束”
通常我会这样做:
number_of_seconds_since_epoch / 3600
但我不太确定一小时是否正好是 3600 秒。我不断听说地球如何不断减速和加速,以及闰年如何做奇怪的事情,等等。
任何人都可以用任何语言向我展示执行此操作的正确方法吗?谢谢!
Java 系统与许多计算机系统一样,假定每天为 24 小时(有些有夏令时变化)。闰秒被视为正常的时间漂移校正,并通过操作系统和 NTP 或 PTP 等协议进行处理。
GMT 没有夏令时变化,因此您可以使用
计算自纪元以来的小时数int hours = (int) (System.currentTimeMillis() / 3600000);
Date API中有关于闰秒的讨论,其中一点:
大多数计算机时钟不够准确,无法反映闰秒的区别。
这里要小心。根据您获取自纪元以来的秒数的方式,您可能不必关心闰秒。如果您调用操作系统 API,您只会获得自 1970-01-01T00:00:00 纪元以来的秒数。
插入闰秒以使日期适应地球自转。操作系统 API 所返回的只是计算自纪元以来的秒数。
java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的旧版java.util
日期时间 API。任何新代码都应使用 java.time
API。
下面的代码为您提供了纪元与现在之间的小时数:
ChronoUnit.HOURS.between(Instant.EPOCH, Instant.now())
TemporalUnit#between
计算两个时间对象之间的时间量,在本例中为 Instant
对象。Instant#EPOCH
是 1970-01-01T00:00:00Z
纪元时刻的常数。Instant#now
从系统时钟获取当前时刻。演示:
class Main {
public static void main(String[] args) {
long epochHours = ChronoUnit.HOURS.between(Instant.EPOCH, Instant.now());
System.out.println(epochHours);
}
}
示例运行的输出:
482101
了解有关现代日期时间 API 的更多信息