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

kmo*_*ort 24 time gps utc unix-timestamp

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

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

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

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

根据我的理解,Unix时间不包括闰秒,这表明315964800是两个时期之间的滴答数.然后我想一想Unix时间如何处理闰秒.它只是重复滴答计数时,有第二插入一个飞跃,而且 1970年和1980年之间插入19闰秒......我开始怀疑,如果重复的事情蜱.我不这么认为,但是这段代码的历史中有人这么认为,而且似乎有效......

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

有人权威请介入吗?

315964800营地

315964819营地

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

Ale*_*ien 24

您所说的不同值是由于将1970年到1980年的偏移与闰秒混合而引起的.
正确的偏移值是315964800秒.

说明:

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

GPS时间未通过闰秒调整.

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

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

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

然后将GPS的当前值添加到UTC偏差(当前为16s).例如,使该值可配置,或从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);
Run Code Online (Sandbox Code Playgroud)

输出此值:

diffSec = 315964800

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


jfs*_*jfs 12

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

至少有两种可能的答案:

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

    from datetime import datetime, timedelta
    print((datetime(1980,1,6) - datetime(1970,1,1)) // timedelta(seconds=1))
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    315964800如果你想找到经过的秒数,这不是正确的答案

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

要回答第二个问题,您需要知道在两个日期之间插入了多少个插入闰秒(将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)))
Run Code Online (Sandbox Code Playgroud)

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

1970年至1972年(当UTC被引入时)的时间有点模糊; TAI-UTC差异不是该时间段内的整数秒数:

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
Run Code Online (Sandbox Code Playgroud)

这是一张图片,显示了多年来UT1,UTC和TAI时间尺度之间的关系: 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
Run Code Online (Sandbox Code Playgroud)

即,3159648191970-01-01 00:00:00 TAI和之间经过了SI秒1980-01-06 00:00:00 UTC(注意:日期用不同的时间尺度表示).

"右"时区使用1970-01-01 00:00:10 TAI纪元(通知:10秒),因此GPS纪元(1980-01-06 00:00:00 UTC)的相应时间戳是315964809(不是315964819).以下是"right"和POSIX时间戳之间差异简洁描述:

tz(zoneinfo)数据库中的"正确"文件与POSIX标准有细微差别.POSIX要求系统时钟值time_t代表自1970-01-01以来的非闰秒数.这与要求POSIX秒为UT的平均太阳秒数相同,而不是UTC自1972-01-01以来计算的原子秒数.

"right"zoneinfo文件声明系统时钟值 time_t代表自1970-01-01以来国际认可的广播时间刻度中的实际秒数.因此,"right"zoneinfo文件所期望的time_t的值大于POSIX指定的time_t的值.time_t值的差异是插入到国际批准的广播时间标度中的闰秒数.截至2015年,差异为26秒.强调是我的


有人权威请介入吗?

IERS BULLETIN C(我上面使用过的数据)是闰秒权威(因此(间接)是UTC和GPS时标之间的差异).


chi*_*aha 5

我想我属于第三个阵营 :)
让我们这样称呼它:
2,904,548,141,415,381,930“铯 133 原子的周期[...]”在大地水准面的 0 开尔文度下测量。(根据您使用的 TAI/SI 定义,给出或采用几亿个周期)

简答:

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

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

详细解答:

使用 TAI 秒
即使它们不是真的,我们假设 1977 年之前的所有 TAI 秒仍然完全等于 1977/1997 定义的 TAI/SI 秒。
我们还假设
“Unix 时间纪元(1970 年 1 月 1 日)”到“GPS 时间纪元(1980 年 1 月 6 日)”
是指
1970-01-01 00:00:10 TAI 到 1980-01-06 00:00:19
在这种情况下TAI 将有
( ( (365 天/年 * 10 年) + 2 个闰日 + 5 天) * 86400 TAI 秒/天 ) + 9 TAI 秒
= 315964809 TAI 秒

使用 UNIX 秒
尽管它们不是真的,但我们假设 1977 年之前 UTC 秒的持续时间仍然完全等于 1977/1997 定义的 TAI/SI 秒。
我们还假设
“Unix 时间纪元(1970 年 1 月 1 日)”到“GPS 时间纪元(1980 年 1 月 6 日)”
是指
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 秒

关于 "Periods[...]"
1977/1997 TAI/SI 秒是用来计算 315964809 秒的 9,192,631,770 个周期 = 2,904,548,141,415,381,930 个周期。1997 SI 秒等于 9,192,631,770 个辐射周期的持续时间,对应于在 0 K 温度下静止的铯 133 原子基态的两个超精细能级之间的跃迁。 1977 年 TAI 的定义测量 SI几秒钟在大地水准面。