python获取当前年月日_如何获取当前的日期和时间,从python的GPS unsegment时间

1586010002-jmsa.png

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 autoupdating tzdata (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 of tzdata package).

All three methods produce the same result.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值