查找自从00:00:00 UTC,2004年1月1日起以Java记录的TAI秒数

问题描述:

正如标题所述,我需要找到自1:00 UTC,1月1日00:00:00开始的TAI的编号2004年1月(Java版)。我最近才知道TAI是什么,并且我试图解决上述问题让我感到困惑。查找自从00:00:00 UTC,2004年1月1日起以Java记录的TAI秒数

我已经试过什么:

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

此外,从我对原子时间的简短研究中,我了解到目前TAI正好比UTC快37(闰秒)秒。

因此,我的思维过程是:

  1. 查找秒1970年和2004年之间(34岁)
  2. 减去从当前UTC时间的数量来获得的数量自2004年以来
  3. 添加37获得在TAI

的的实际秒数我不能确定这里的数学(1天= 86400秒):

  • 选项1:86400(秒)×365.25(天(1 Julian Year))×34(岁)= 1072958400
  • 选项2:86400(秒)×365(天(1 Common Year))×34(岁)= 1072224000

在这一点上,我开始质疑比较UTC时加入到TAI 37闰秒是否考虑闰年,因此我应该使用选项2。不幸的是,我不确定我的思维过程是否正确,我认为在这里要求确定一下会更好。

另外,我发现this cite声称(秒),相当于01/01/2004 @上午12:00(UTC)。哪种让我失望,因为它不等于我的任何一次计算。

+0

上的飞跃__year__计算在二月额外的一天,当你可能会越来越偏离轨道。因此使用选项2不是正确的选择。每年添加0.25也不准确,因为季度日只有在积累到一整天时才真正添加到UTC。 – Mordechai

+0

难道你不能只是做'((currentDate()。getTime() - startOf2004.getTime())/ 1000)+ 37'吗? 'java.util.Date#getTime()'为您提供自那时以来Epoch以来的毫秒数。 –

+1

乘以365或365.25只是近似值。从1970年到2004年有34年,其中8年是闰年,达到12,418天。 –

Tai-seconds基本上是原子SI秒,包括闰秒。我的图书馆Time4J开箱即用支持此功能。有关TAI-支持的详细信息请参见也Moment类的javadoc

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