问题描述
我有gps未分段的时间,如下所示:
Tgps = 1092121243.0
/ pre>
我想了解这个日期和时间。 GPS时间的开始是1980年1月6日。Python功能
datetime.utcfromtimestamp
可以从1970年1月1日起给出秒。
我发现以下内容:
从$ datetime import datetime
GPSfromUTC =(datetime(1980,1,6) - datetime(1970,1,1))。 total_seconds()
curDate = datetime.utcfromtimestamp(Tgps + GPSfromUTC)
输出[83]:datetime.datetime(2014,8,15,7,0,43)
我不确定它们是否包含在函数datetime中,或者我应该从结果中计算和减少
也可能存在这个问题的更好的解决方案?解决方案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)
是给定日期之前引入的闰秒数。从(注意:该网站是闰秒的权威来源,它发布):1980 ..:19s
2012 ..:35s
因此:
(leap_count(2014) - leap_count(1980))==(35 - 19)
如果您使用的是Unix,那么您可以使用
right
时区从TAI时间获取UTC时间
(并且很容易从GPS时间获取TAI时间:):#!/ usr / bin / env python
import os
进口时间
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)
#定义
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)
#定义
tai_timestamp =(gps_time_as_tai - tai_epoch_as_tai).total_seconds()
print(datetime.utcfromtimestamp(tai_timestamp))#righttimezone有效!
输出
2014-08-15 07:00:27#(UTC)
如果从相应的。它是前两种方法的组合,其中第一种方法的跳跃计数计算是自动化的,并且自动更新
tzdata
(系统包为):>>>从datetime import datetime,timedelta
>>>导入leapseconds
>>>> leapseconds.gps_to_utc(datetime(1980,1,6)+ timedelta(seconds = 1092121243.0))
datetime.datetime(2014,8,15,7,0,27)
其中可以从
/ usr / share / zoneinfo / right / UTC
文件中提取闰秒(tzdata
包)。
所有三种方法都产生相同的结果。
I have gps unsegmented time like this:
Tgps = 1092121243.0
And I'd like to understand what date and time is that. The begining of GPS time is 6 January 1980. Python function
datetime.utcfromtimestamp
could give seconds from 1 January 1970 year.
I found following:
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)
I'm not sure about leapseconds are they included in function datetime or I should calculate them and substract from the result?May be also exists better solution of this problem?
解决方案GPS time started in sync with UTC:
1980-01-06 (UTC) == 1980-01-06 (GPS)
. Both tick in SI seconds. The difference between GPS time and UTC time increases with each (intercalary) leap second.To find the correct UTC time, you need to know the number of leap seconds occurred before the given GPS time:
#!/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)
Output
2014-08-15 07:00:27 # (UTC)
where
leap_count(date)
is the number of leap seconds introduced before the given date. From TAI-UTC table (note: the site is the authoritative source on leap seconds. It publishes Bulletin C announcing new leap seconds):1980..: 19s 2012..: 35s
and therefore:
(leap_count(2014) - leap_count(1980)) == (35 - 19)
If you are on Unix then you could use
"right"
time zone to get UTC time from TAI time(and it is easy to get TAI time from GPS time: TAI = GPS + 19 seconds (constant offset)):#!/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!
Output
2014-08-15 07:00:27 # (UTC)
You could avoid changing the timezone if you extract the leap seconds list from the corresponding
tzfile(5)
. It is a combination of the first two methods where the leap count computation from the first method is automated and the autoupdatingtzdata
(system package for the tz database) from the second method is used:>>> 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)
where
leapseconds.py
can extract leap seconds from/usr/share/zoneinfo/right/UTC
file (part oftzdata
package).All three methods produce the same result.
这篇关于如何获取当前的日期和时间,从python的GPS unsegment时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!