如何在python中从GPS未分段时间中获取当前日期和时间
我的gps未分段时间如下:如何在python中从GPS未分段时间中获取当前日期和时间,python,datetime,gps,Python,Datetime,Gps,我的gps未分段时间如下: Tgps = 1092121243.0 我想知道那是什么日期和时间。GPS时间开始于1980年1月6日。Python函数 datetime.utcfromtimestamp 可以从1970年1月1日起给出秒数 我发现: from datetime import datetime GPSfromUTC = (datetime(1980,1,6) - datetime(1970,1,1)).total_seconds() curDate = datetime.utc
Tgps = 1092121243.0
我想知道那是什么日期和时间。GPS时间开始于1980年1月6日。Python函数
datetime.utcfromtimestamp
可以从1970年1月1日起给出秒数
我发现:
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)
def gps2utc(week, secs):
"""
:param week: GPS week number, i.e. 1866
:param secs: number of seconds since the beginning of `week`
:return: datetime instance with UTC time
"""
secs_in_week = 604800
gps_epoch = datetime(1980, 1, 6, 0, 0, 0)
date_before_leaps = gps_epoch + timedelta(seconds=week * secs_in_week + secs)
return date_before_leaps - timedelta(seconds=leap(date_before_leaps))
我不确定它们是否包含在函数datetime中,或者我应该计算它们并从结果中减去?
可能还有更好的解决方案吗?GPS时间与UTC同步开始:
1980-01-06(UTC)==1980-01-06(GPS)
。两者都以秒为单位。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)
输出
其中leap\u count(date)
是给定日期之前引入的闰秒数。发件人(注:该网站是leap seconds的权威来源。它发布):
因此:
(leap_count(2014) - leap_count(1980)) == (35 - 19)
如果您在Unix上,则可以使用
“right”
时区从TAI时间获取UTC时间
(而且很容易从GPS时间获取TAI时间:):
输出
如果从相应的列表中提取闰秒列表,则可以避免更改时区。它是前两种方法的组合,其中第一种方法的跳跃计数计算是自动的,而第二种方法的自动更新
tzdata
(系统包for)是使用的:
>>> 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)
其中可以从/usr/share/zoneinfo/right/UTC
文件(属于tzdata
软件包)中提取闰秒
这三种方法产生相同的结果。我使用以下计算闰秒的函数:
import bisect
from datetime import datetime, timedelta
_LEAP_DATES = ((1981, 6, 30), (1982, 6, 30), (1983, 6, 30),
(1985, 6, 30), (1987, 12, 31), (1989, 12, 31),
(1990, 12, 31), (1992, 6, 30), (1993, 6, 30),
(1994, 6, 30), (1995, 12, 31), (1997, 6, 30),
(1998, 12, 31), (2005, 12, 31), (2008, 12, 31),
(2012, 6, 30), (2015, 6, 30), (2016, 12, 31))
LEAP_DATES = tuple(datetime(i[0], i[1], i[2], 23, 59, 59) for i in _LEAP_DATES)
def leap(date):
"""
Return the number of leap seconds since 1980-01-01
:param date: datetime instance
:return: leap seconds for the date (int)
"""
# bisect.bisect returns the index `date` would have to be
# inserted to keep `LEAP_DATES` sorted, so is the number of
# values in `LEAP_DATES` that are less than `date`, or the
# number of leap seconds.
return bisect.bisect(LEAP_DATES, date)
当然,您需要偶尔更新\u LEAP\u DATES
,但这些更新非常罕见
通常,GPS时间由两个数字组成:GPS周和自当前GPS周开始的秒数。因此,您可以使用以下选项:
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)
def gps2utc(week, secs):
"""
:param week: GPS week number, i.e. 1866
:param secs: number of seconds since the beginning of `week`
:return: datetime instance with UTC time
"""
secs_in_week = 604800
gps_epoch = datetime(1980, 1, 6, 0, 0, 0)
date_before_leaps = gps_epoch + timedelta(seconds=week * secs_in_week + secs)
return date_before_leaps - timedelta(seconds=leap(date_before_leaps))
在您的情况下,week=0
,因此:
In [1]: gps2utc(0, 1092121243.0)
Out[1]: datetime.datetime(2014, 8, 15, 7, 0, 27)
您可以使用软件包执行以下操作:
到泰山的GPS时间
返回2014-08-15 07:01:02.000
全球定位系统到UTC的时间
它输出
2014-08-15 07:00:27.000
为了确保您的代码是最新的,您必须每年咨询两次(理论上每年咨询4次)。您可以依赖自动更新的tzdata
系统包。
def gps2utc(week, secs):
"""
:param week: GPS week number, i.e. 1866
:param secs: number of seconds since the beginning of `week`
:return: datetime instance with UTC time
"""
secs_in_week = 604800
gps_epoch = datetime(1980, 1, 6, 0, 0, 0)
date_before_leaps = gps_epoch + timedelta(seconds=week * secs_in_week + secs)
return date_before_leaps - timedelta(seconds=leap(date_before_leaps))
In [1]: gps2utc(0, 1092121243.0)
Out[1]: datetime.datetime(2014, 8, 15, 7, 0, 27)
from astropy.time import Time
mytime = 1092121243.0
t = Time(mytime, format='gps')
t = Time(t, format='iso') # same as scale='tai'
print(t)
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)