内容转载自个人博客java
它是在协调世界时(UTC)中增长或减小一秒,使它与平太阳时贴近所作调整。须要闰秒的部分缘由是由于平均太阳日(mean solar day)的长度正以很是缓慢的速度增长中,另外一个缘由是原子钟赋予秒固定的时间长度。而当二者结合时,就已经比当时的太阳时的秒短少了一点点。时间如今是以稳定的原子钟来测量(TAI或国际原子时),由于地球自转有着许多的变数,因此之前的秒定义(地球绕着轴自转和绕太阳的公转,以平均太阳日的1/86400来定义)被废除。当要增长正闰秒时,这一秒是增长在次日的00:00:00以前,效果是延缓UTC次日的开始。当天23:59:59的下一秒被记为23:59:60,而后才是次日的00:00:00。若是是负闰秒的话,23:59:58的下一秒就是次日的00:00:00了,但目前尚未负闰秒调整的需求
Leap_Second.dat能够查看每次闰秒的时间和第几回闰秒,主要内容以下:python
# MJD Date TAI-UTC (s) # day month year # --- -------------- ------ # 41317.0 1 1 1972 10 41499.0 1 7 1972 11 41683.0 1 1 1973 12 42048.0 1 1 1974 13 42413.0 1 1 1975 14 42778.0 1 1 1976 15 43144.0 1 1 1977 16 43509.0 1 1 1978 17 43874.0 1 1 1979 18 44239.0 1 1 1980 19 44786.0 1 7 1981 20 45151.0 1 7 1982 21 45516.0 1 7 1983 22 46247.0 1 7 1985 23 47161.0 1 1 1988 24 47892.0 1 1 1990 25 48257.0 1 1 1991 26 48804.0 1 7 1992 27 49169.0 1 7 1993 28 49534.0 1 7 1994 29 50083.0 1 1 1996 30 50630.0 1 7 1997 31 51179.0 1 1 1999 32 53736.0 1 1 2006 33 54832.0 1 1 2009 34 56109.0 1 7 2012 35 57204.0 1 7 2015 36 57754.0 1 1 2017 37
根据文件Leap_Second.dat能够得知,截止2020年08月:
TAI = UTC + 37
因为GPST从1980年1月6日0时0分0秒开始计时,因此1980年1月1日及之前的闰秒不考虑,则:
GPST = UTC + 18
另外,leapsecond能够查看实时的UTC、GPST、TAI时间函数
时区是指地球上的某一个区域使用同一个时间定义。GMT时间或者UT时间,都是表示地球自转速率的一种形式。从太阳升起到太阳落下,时刻从0到24变化。这样,不一样经度的地方时间天然会不相同。为了解决这个问题,人们把地球按经度划分为不一样的区域,每一个区域内使用同一个时间定义,相邻的区域时间差为1个小时。时区又分为理论时区和法定时区code
根据此代码,修改最后一行fromtimestamp(timestamp, timezone(timedelta(hours=8)))
便可实现UTC转不一样时区orm
from datetime import datetime, timedelta, timezone # UTC时间转本地时间(北京)时间 # 1. 把utc的str转为datetime(无时区信息) # 2. 添加时区信息为utc时区 # 3. datetime转为时间戳 # 4. 从时间戳获得本地时间datetime # 输入格式为:'2020-08-05 02:03:03.815650' # 输出格式为:datetime.datetime(2020, 8, 5, 10, 3, 3, 815650) def utc_to_local(utc_time): datetimeformat = "%Y-%m-%d %H:%M:%S.%f" # 获得不包含时区的datetime dt_no_tz = datetime.strptime(utc_time, datetimeformat) # 设置时区为UTC # timezone.utc与timezone(timedelta(hours=0))同样 utc_datetime = dt_no_tz.replace(tzinfo=timezone(timedelta(hours=0))) t = utc_datetime.timestamp() # 根据时间戳获得UTC时间 # datetime.utcfromtimestamp(t) # 若是要将时间戳转化为东八区datetime # fromtimestamp(timestamp, timezone(timedelta(hours=8))) # 根据时间戳获得本地时间fromtimestamp(t, tz=None) return datetime.fromtimestamp(t)
根据此代码,修改replace(tzinfo=timezone(timedelta(hours=8)))
便可实现某个时区转UTC时间htm
from datetime import datetime, timedelta, timezone # 本地时间转UTC时间 # 输入格式为:'2020-08-05 10:03:03.815650' # 输出格式为:datetime.datetime(2020, 8, 5, 2, 3, 3, 815650) def local_to_utc(local_time): datetimeformat = "%Y-%m-%d %H:%M:%S.%f" # 获得不包含时区的datetime dt_no_tz = datetime.strptime(local_time, datetimeformat) # 设置时区为本地时区(北京,东八区) # timezone.utc与timezone(timedelta(hours=0))同样 local_datetime = dt_no_tz.replace(tzinfo=timezone(timedelta(hours=8))) t = local_datetime.timestamp() # 根据时间戳获得UTC时间 return datetime.utcfromtimestamp(t)
将GPS时间转换为UTC时间blog
from datetime import datetime, timedelta # 闰秒 LEAP_SECONDS = 18 # 输入:GPS周、GPS周内秒、闰秒(可选,gps时间不一样,闰秒值也不一样,由Leap_Second.dat文件决定) # 输出:UTC时间(格林尼治时间) # 输入示例: gps_week_seconds_to_utc(2119, 214365.000) # 输出示例: '2020-08-18 11:32:27.000000' def gps_week_seconds_to_utc(gpsweek, gpsseconds, leapseconds=LEAP_SECONDS): datetimeformat = "%Y-%m-%d %H:%M:%S.%f" epoch = datetime.strptime("1980-01-06 00:00:00.000", datetimeformat) # timedelta函数会处理seconds为负数的状况 elapsed = timedelta(days=(gpsweek*7), seconds=(gpsseconds-leapseconds)) return datetime.strftime(epoch+elapsed, datetimeformat)
将UTC时间转换为GPS时间get
from datetime import datetime, timedelta # 闰秒 LEAP_SECONDS = 18 # 输入:UTC时间(datetime类型) # 输出:GPS周、周内日、周内秒、毫秒 def utc_to_gps_week_seconds(utc, leapseconds=LEAP_SECONDS): datetimeformat = "%Y-%m-%d %H:%M:%S.%f" epoch = datetime.strptime("1980-01-06 00:00:00.000", datetimeformat) tdiff = utc - epoch + timedelta(seconds=leapseconds) gpsweek = tdiff.days // 7 gpsdays = tdiff.days - 7*gpsweek gpsseconds = tdiff.seconds + 86400*(tdiff.days -7*gpsweek) return gpsweek, gpsdays, gpsseconds, tdiff.microseconds