Unix纪元和GPS纪元之间的嘀嗒声

时间:2013-12-11 14:27:51

标签: time gps unix-timestamp utc

Unix时代(1970年1月1日)与GPS时代(1980年1月6日)之间的一秒钟滴数是多少?

我在网上看到了多个来源的多个答案。一个阵营声称答案是 315964800 ,另一个阵营声称 315964819 。我一直认为它是315964800,但现在不太确定。

我刚刚发现我的软件基线在过去的八年里一直在使用315964819。我很难理解如何将我们的嵌入式设备与其他设备集成在一起的时间为19秒,没有人注意到它。

我认为将315964819放入代码基线的人必须错误地使用TAI偏移量(19秒)。

根据我的理解,Unix时间不包括闰秒,这表明315964800是两个时期之间的刻度数。然后我想一想Unix时间如何处理闰秒。当插入闰秒时,它只是重复滴答计数,并且在1970年到1980年之间插入了 19闰秒......我开始怀疑重复的滴答是否重要。我不这么认为,但是这段代码历史上有人这么认为,而且似乎有效......

它的长期和短期是我将要在这个产品的黑暗时代改变一个恒定的设置,这与时间有关,这对于平台来说非常重要,从它的内容到我认为的更多准确的,我想从比我更知识渊博的人那里得到一些赞许。

请某位权威人士请介入此处吗?

315964800 camp

315964819 camp

另请注意,我只是向GPS纪元询问Unix纪元。我很确定我们已经有闰秒,因为GPS时代适当地覆盖了。

4 个答案:

答案 0 :(得分:22)

您所说的不同值是由于1970年到1980年的偏移与闰秒的混合造成的 正确的偏移值是315964800秒。

<强>解释

UTC和GPS时间每18个月平均缩短一次。 这被称为闰秒,以UTC时基引入,是调整地球自转变化所必需的。

GPS时间未通过闰秒调整。

目前(2013年)有16s的偏移:
GPS时间-UTC = 16秒

Unix时间是时间格式而不是时间参考。 它表示自1.1.1970 UTC以来的毫秒数(或秒数)。 理想情况下,您的系统时间与TimeServer(NTP)的UTC同步。

要转换并获得偏移量,您应使用固定偏移量:(6.1.1980 UTC - 1.1.1970 UTC)

然后将GPS的当前值添加到UTC偏差(当前为16秒)。 例如,使该值可配置,或从GPS设备读取当前偏移量(他们知道UTC和GPS时间之间的差异)

您所说的不同值是由于1970年到1980年的混合因闰秒而产生的。 不要这样做,单独处理它们。

这个java程序:

SimpleDateFormat df = new SimpleDateFormat();
df.setTimeZone(TimeZone.getTimeZone("UTC"));

Date x = df.parse("1.1.1970 00:00:00");
Date y = df.parse("6.1.1980 00:00:00");

long diff = y.getTime() - x.getTime();
long diffSec = diff / 1000;

System.out.println("diffSec= " + diffSec);

输出此值:

  

diffSec = 315964800

因此,这是GPS时间开始的1.1.1970 UTC和6.1.1980 UTC之间的正确偏移。 然后你必须再纠正自6.1.1980和今天以来引入的16秒,以计算当前UTC时间的GPS时间。

答案 1 :(得分:11)

  

Unix时代(1970年1月1日)与GPS时代(1980年1月6日)之间的一秒钟滴数是多少?

   

至少有两种可能的答案:

  1. 1980-01-06 UTC的POSIX时间戳是什么?回答:315964800(确切地说),在Python中:

    from datetime import datetime, timedelta
    print((datetime(1980,1,6) - datetime(1970,1,1)) // timedelta(seconds=1))
    

    日期不计算闰秒之间的SI秒数。换句话说,代码显示事件之间传递了多少“UT1”秒(平均太阳日的~1 / 86400)。

    UTC,GPS时间刻度以SI秒为单位。 UTC“忘记”闰秒,因此日期之间的实际SI秒数略大于POSIX时间戳。

    如果您想要找到已过去秒,

    315964800不是正确的答案

  2. 1970-01-01 UTC和1980-01-06 UTC之间经过了多少SI秒?答案:315964811(大约)。

  3. 要回答第二个问题,您需要知道在两个日期之间插入了多少闰间闰秒(将UTC转换为国际原子时(TAI)):

    #!/usr/bin/env python3
    from datetime import datetime, timedelta
    
    tai_posix_epoch = datetime(1970, 1, 1) + timedelta(seconds=8, microseconds=82)
    tai_gps_epoch = datetime(1980, 1, 6) + timedelta(seconds=19)
    print(round((tai_gps_epoch - tai_posix_epoch) / timedelta(seconds=1)))
    

    TAI和GPS时间之间的差异在10秒内是恒定的。

    The time between 1970 and 1972 (when UTC was introduced) is a little fuzzy; the TAI-UTC difference is not integer number of seconds in that period

    from decimal import Decimal as D
    
    MJD_1970_01_01 = 40587
    dAT_1970_01_01 = D("4.213170") + (MJD_1970_01_01 - 39126) * D("0.002592")
    # -> delta(AT) = TAI - UTC = Decimal('8.000082') # 8 seconds, 82 microseconds
    

    这是显示the relation between UT1, UTC, and TAI time scales over the years的图片: UTC-TAI 每个步骤都是从TAI开始的闰秒 - 在1972-01-01的UTC = 10s。截至2015年7月1日已插入26个正闰秒。


    如果使用315964819纪元,则可以解释

    1970-01-01 00:00:00 TAI时间戳:

    print(datetime(1970, 1, 1) + timedelta(seconds=315964819)) # TAI
    # 1980-01-06 00:00:19 TAI or 1980-01-06 00:00:00 UTC
    

    即完全 315964819 1970-01-01 00:00:00 TAI1980-01-06 00:00:00 UTC之间经过了SI秒(注意:日期用不同的时间刻度表示)。

    “正确”时区使用1970-01-01 00:00:10 TAI纪元(通知:10秒),因此GPS纪元(1980-01-06 00:00:00 UTC)的相应时间戳为 {{1} } (不是315964809)。这是一个succinct description of the difference between "right" and POSIX timestamps

      

    tz(zoneinfo)数据库中的“正确”文件有一个微妙的   与POSIX标准不同。 POSIX要求系统   时钟值315964819表示自非闰秒数   1970-01-01 。这与要求POSIX秒为均值相同   UT的太阳秒数,而不是UTC计算的原子秒数   1972年1月1日。

         

    “right”zoneinfo文件断言系统时钟值为   time_t代表国际上的实际秒数   自1970-01-01以来批准的广播时间表。结果是价值   “right”zoneinfo文件所期望的time_t更大   而不是POSIX指定的time_t的值。 的差异   time_t的值是已经的闰秒数   插入国际认可的广播时间表。截至   2015年差异为26秒。强调是我的


      

    请某位权威人士请介入此处吗?

    IERS BULLETIN C(我上面使用过的数据)在闰秒上是 权限(因此(间接)是UTC和GPS时间刻度之间的差异)。

答案 2 :(得分:4)

我想我是第三阵营:) 让我们称之为:
2,904,548,141,415,381,930和#34;铯133原子的时期[...]在大地水准面以0开氏度测量。 (根据您使用的TAI / SI定义,给予或采取几亿个周期)

简答:

这取决于您使用的时间尺度(以及这些时间尺度的定义)。

315964809 在TAI秒(1977年定义)中,因此UTC秒 在UNIX秒中 315964800
(两者相等于彼此但仅在您指定的日期之间,并且都对应于2,904,548,141,415,381,930和#34;期间[...]&#34;)
请注意在UTC闰秒完成后,UNIX秒重播同一秒,以便UTC秒,2012-06-30 23:59:60 UTC和2012-07 -01 00:00:00 UTC,均由UNIX时间戳1341100800表示。

详细答案:

使用TAI秒
尽管它们并非如此,但我们假设1977年之前的所有TAI秒仍然完全等于1977/1997年TAI / SI秒的定义。 我们也假设通过
&#34; Unix时代(1970年1月1日)&#34;到GPS时间纪元(1980年1月6日)&#34;
你的意思是
1970-01-01 00:00:10 TAI to 1980-01-06 00:00:19 TAI
在这种情况下会有(((365天/年* 10年)+ 2闰天+ 5天)* 86400 TAI秒/天)+ 9 TAI秒
= 315964809 TAI秒

使用UNIX秒
尽管它们并非如此,但我们假设1977年之前的UTC秒的持续时间仍然完全等于1977/1997年TAI / SI秒的定义。
我们也假设通过
&#34; Unix时代(1970年1月1日)&#34;到GPS时间纪元(1980年1月6日)&#34;
你的意思是
1970-01-01 00:00:00 UTC到1980-01-06 00:00:00 UTC
并且在完成闰秒后,UNIX时间会跳过一秒钟
在这种情况下会有(((365天/年* 10年)+ 2个闰日+ 5天)* 86400秒/天)+ 9个闰秒 - 9个unix闰秒重复次数
= 315964800 UNIX秒

关注&#34;期间[...]&#34;
1977/997 TAI / SI秒是用于提出315964809秒的9,192,631,770个周期,每个周期= 2,904,548,141,415,381,930个周期。 1997年SI秒等于9,192,631,770个辐射周期的持续时间,该周期对应于在0K的温度下静止的铯-133原子的基态的两个超精细水平之间的转变。1977年TAI的定义测量SI大地水准面的秒数。

答案 3 :(得分:1)

回到原始问题, “Unix时代(1970年1月1日)”到“GPS时代(1980年1月6日)”,所以时代是315964800,315964819是'GPS时代'到'GPS时代'。这意味着315964819 = 315964800 + 19。 所以您在代码中使用的纪元值实际上取决于您使用的时间纪元。