在Java中查找自2004年1月1日UTC 00:00:00以来的TAI秒数

在Java中查找自2004年1月1日UTC 00:00:00以来的TAI秒数,java,time,utc,tai-time,Java,Time,Utc,Tai Time,正如标题所述,我需要查找自2004年1月1日UTC 00:00:00(Java)以来的秒数。我最近才知道什么是TAI,我试图解决上述问题,这让我有点困惑 我所尝试的: 我知道在Java中,您可以使用System.currentTimeMillis()获取自1970年1月1日UTC()以来的毫秒数 此外,从我对原子时的简要研究中,我了解到目前TAI比UTC提前37秒(闰秒) 因此,我的思考过程是: 查找1970年和2004年之间的秒数(34年) 从当前UTC时间中减去该时间,即可得到自2004年以

正如标题所述,我需要查找自2004年1月1日UTC 00:00:00(Java)以来的秒数。我最近才知道什么是TAI,我试图解决上述问题,这让我有点困惑

我所尝试的:

我知道在Java中,您可以使用
System.currentTimeMillis()
获取自1970年1月1日UTC()以来的毫秒数

此外,从我对原子时的简要研究中,我了解到目前TAI比UTC提前37秒(闰秒)

因此,我的思考过程是:

  • 查找1970年和2004年之间的秒数(34年)
  • 从当前UTC时间中减去该时间,即可得到自2004年以来
  • 加37以获取TAI中的实际秒数
  • 我不确定这里的数学(1天=86400秒):

    • 选项1:86400(秒)x 365.25(天())x 34(年)=1072958400
    • 选项2:86400(秒)x 365(天())x 34(年)=1072224000
    在这一点上,我开始质疑,与UTC相比,TAI中增加的37闰秒是否是闰年,因此我应该使用选项2。不幸的是,我不确定我的思维过程是否正确,我想最好在这里问一下,以确定是否正确


    此外,我发现1072915200(秒)相当于01/01/2004@12:00am(UTC)。因为它不等于我的任何一个计算结果,所以我对它很反感。

    Tai秒本质上是原子的SI秒,包括闰秒。我的库支持此功能的开箱即用。有关TAI支持的更多详细信息,请参见《时刻》课程:

    Moment m2004 = PlainTimestamp.of(2004, 1, 1, 0, 0).atUTC();
    Moment now = SystemClock.currentMoment(); // other clocks based on NTP are possible
    long seconds = SI.SECONDS.between(m2004, now);
    
    System.out.println(seconds); // 425222084L
    System.out.println(now); // 2017-06-22T13:15:24,570000000Z
    

    在计算闰年2月的额外天数时,你可能偏离了轨道。因此,使用选项2不是正确的选择。每年增加0.25也不准确,因为只有当UTC累积到一整天时,季度日才真正添加到UTC中。您难道不能执行类似于
    ((currentDate().getTime()-startOf2004.getTime())/1000)+37的操作吗
    java.util.Date#getTime()
    提供该时间瞬间自历元起的毫秒数。乘以365或365.25只是近似值。从1970年到2004年有34年,其中8年是闰年,计算起来是12418天。