计算自纪元以来有多少个小时?

问题描述 投票:0回答:4

这是一个简单的问题,但我对答案可能有多复杂感到紧张。

我想在我的应用程序中知道自该纪元以来已经过去了多少小时。更具体地说,我想知道“自纪元以来有多少次 GMT 时钟以 :00 结束”

通常我会这样做:

number_of_seconds_since_epoch / 3600

但我不太确定一小时是否正好是 3600 秒。我不断听说地球如何不断减速和加速,以及闰年如何做奇怪的事情,等等。

任何人都可以用任何语言向我展示执行此操作的正确方法吗?谢谢!

java c date unix-timestamp epoch
4个回答
2
投票

Java 系统与许多计算机系统一样,假定每天为 24 小时(有些有夏令时变化)。闰秒被视为正常的时间漂移校正,并通过操作系统和 NTP 或 PTP 等协议进行处理。

GMT 没有夏令时变化,因此您可以使用

计算自纪元以来的小时数
int hours = (int) (System.currentTimeMillis() / 3600000);

1
投票

Date API中有关于闰秒的讨论,其中一点:

大多数计算机时钟不够准确,无法反映闰秒的区别。


0
投票

这里要小心。根据您获取自纪元以来的秒数的方式,您可能不必关心闰秒。如果您调用操作系统 API,您只会获得自 1970-01-01T00:00:00 纪元以来的秒数。

插入闰秒以使日期适应地球自转。操作系统 API 所返回的只是计算自纪元以来的秒数。


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API。

使用现代日期时间 API 的解决方案

下面的代码为您提供了纪元与现在之间的小时数:

ChronoUnit.HOURS.between(Instant.EPOCH, Instant.now())
  1. TemporalUnit#between
    计算两个时间对象之间的时间量,在本例中为
    Instant
    对象。
  2. Instant#EPOCH
    1970-01-01T00:00:00Z
    纪元时刻的常数。
  3. Instant#now
    从系统时钟获取当前时刻。

演示:

class Main {
    public static void main(String[] args) {
        long epochHours = ChronoUnit.HOURS.between(Instant.EPOCH, Instant.now());
        System.out.println(epochHours);
    }
}

示例运行的输出:

482101

在线演示

Trail:日期时间

了解有关现代日期时间 API 的更多信息
© www.soinside.com 2019 - 2024. All rights reserved.