如何从python中的GPS未分段时间获取当前日期和时间

新手上路,请多包涵

我有这样的 gps 未分段时间:

 Tgps = 1092121243.0

我想知道那是什么日期和时间。 GPS时间的开始是1980年1月6日。Python函数

datetime.utcfromtimestamp

可以给出从 1 January 1970 年开始的秒数。

我发现以下内容:

 from datetime import datetime
GPSfromUTC = (datetime(1980,1,6) - datetime(1970,1,1)).total_seconds()
curDate = datetime.utcfromtimestamp(Tgps + GPSfromUTC)

Out[83]: datetime.datetime(2014, 8, 15, 7, 0, 43)

我不确定闰秒是否包含在函数 datetime 中,或者我应该计算它们并从结果中减去?可能还存在更好的解决这个问题的方法吗?

原文由 Anton Protopopov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 449
2 个回答

GPS 时间开始与 UTC 同步: 1980-01-06 (UTC) == 1980-01-06 (GPS) 。两者都以 SI 秒计。 GPS 时间和 UTC 时间之间的差异随着每个(闰秒)闰秒而增加。

要找到正确的 UTC 时间,您需要知道给定 GPS 时间之前发生的闰秒数:

 #!/usr/bin/env python
from datetime import datetime, timedelta

# utc = 1980-01-06UTC + (gps - (leap_count(2014) - leap_count(1980)))
utc = datetime(1980, 1, 6) + timedelta(seconds=1092121243.0 - (35 - 19))
print(utc)

输出

2014-08-15 07:00:27 # (UTC)

其中 leap_count(date) 是在给定日期之前引入的闰秒数。来自 TAI-UTC 表(注意:该站点是闰秒的权威来源。它发布 公告 C 宣布新的闰秒):

 1980..: 19s
2012..: 35s

因此:

 (leap_count(2014) - leap_count(1980)) == (35 - 19)


如果您使用的是 Unix,那么您可以使用 "right" 时区从 TAI 时间获取 UTC 时间(并且很容易从 GPS 时间获取 TAI 时间: TAI = GPS + 19 秒(常数偏移) ):

 #!/usr/bin/env python
import os
import time

os.environ['TZ'] = 'right/UTC' # TAI scale with 1970-01-01 00:00:10 (TAI) epoch
time.tzset() # Unix

from datetime import datetime, timedelta

gps_timestamp = 1092121243.0 # input
gps_epoch_as_gps = datetime(1980, 1, 6)
# by definition
gps_time_as_gps = gps_epoch_as_gps + timedelta(seconds=gps_timestamp)
gps_time_as_tai = gps_time_as_gps + timedelta(seconds=19) # constant offset
tai_epoch_as_tai = datetime(1970, 1, 1, 0, 0, 10)
# by definition
tai_timestamp = (gps_time_as_tai - tai_epoch_as_tai).total_seconds()
print(datetime.utcfromtimestamp(tai_timestamp)) # "right" timezone is in effect!

输出

2014-08-15 07:00:27 # (UTC)


如果从相应的 tzfile(5) 中提取闰秒列表,则可以避免更改时区。它是前两种方法的组合,其中第一种方法的跳跃计数计算是自动化的,并且使用第二种方法的自动更新 tzdatatz 数据库的 系统包):

 >>> from datetime import datetime, timedelta
>>> import leapseconds
>>> leapseconds.gps_to_utc(datetime(1980,1,6) + timedelta(seconds=1092121243.0))
datetime.datetime(2014, 8, 15, 7, 0, 27)

其中 leapseconds.py 可以从 /usr/share/zoneinfo/right/UTC 文件中提取闰秒( tzdata 包的一部分)。

所有三种方法产生相同的结果。

原文由 jfs 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 astropy.time 包来执行此操作:

到 TAI 的 GPS 时间

from astropy.time import Time
mytime = 1092121243.0
t = Time(mytime, format='gps')
t = Time(t, format='iso') # same as scale='tai'
print(t)

返回 2014-08-15 07:01:02.000

GPS 时间到 UTC

 from astropy.time import Time
sec = 1092121243.0
t_in = Time(sec, format='gps')
t_out = Time(t_in, format='iso', scale='utc')
print(t_out)

输出 2014-08-15 07:00:27.000

原文由 Ru887321 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题