Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从GPS未分段时间中获取当前日期和时间_Python_Datetime_Gps - Fatal编程技术网

如何在python中从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

我的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.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)