常用的几种时间系统GMT、UTC等以及使用Python代码GPS时间转UTC时间
內容轉載自我的博客
文章目錄
- 時間標準
- 閏秒
- TAI、GPST、UTC換算
- 時區劃分
- UTC時間轉本地時間(東八區)
- 本地時間(東八區)轉UTC
- GPS時間轉UTC時間
- UTC時間轉GPS時間
時間標準
- 格林尼治標準時間GMT(Greenwich Mean Time):它是指位于英國倫敦郊區的皇家格林尼治天文臺當地的平太陽時,因為本初子午線被定義為通過那里的經線。自1924年2月5日開始,格林尼治天文臺負責每隔一小時向全世界發放調時信息。格林尼治標準時間的正午是指當平太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。由于地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林尼治平時基于天文觀測本身的缺陷,已經被原子鐘報時的協調世界時(UTC)所取代
- 世界時UT(Universal Time):它是一種以格林威治子夜起算的平太陽時。世界時是以地球自轉為基準得到的時間尺度,其精度受到地球自轉不均勻變化和極移的影響,為了解決這種影響,1955年國際天文聯合會定義了UT0、UT1和UT2三個系統:UTO表示未經改正的世界時,UT1表示經過極移改正的世界時,UT2表示進一步經過地球自轉速度的季節性改正后的世界時
- 國際原子時TAI(International Atomic Time):英語簡稱為IAT,法語簡稱為TAI,最終使用法語簡稱TAI。它是根據秒的定義(1秒為銫-133原子基態兩個超精細能級間躍遷輻射振蕩9192631770周所持續的時間)的一種國際參照時標,是均勻的時間尺度,與地球的空間位置不關聯,起點為1958年1月1日0時0分0秒。隨著時間的遷延,TAI和UT1兩種時間尺度的時間差越來越大。為此,在UT1和TAI之間進行協調,這就產生了協調世界時UTC
- 協調世界時UTC(Coordinated Universal Time):它是最主要的世界時間標準,基于國際原子時,并通過不規則的加入閏秒來抵消地球自轉變慢的影響。它又稱為世界統一時間、世界標準時間、國際協調時間。由于英文(CUT)和法文(TUC)的縮寫不同,作為妥協,簡稱UTC。協調世界時(UTC)是世界上調節時鐘和時間的主要時間標準,是最接近格林威治標準時間(GMT)的幾個替代時間系統之一。對于大多數用途來說,UTC時間被認為能與GMT時間互換。人們對該時間系統進行過數次調整,直到1972年引入了閏秒機制,調整工作得以簡化。閏秒在必要的時候會被插入到UTC中,以保證協調世界時(UTC)與世界時(UT1)相差不超過0.9秒
- Unix或POSIX時間戳:它是UNIX或類UNIX系統使用的時間表示方式。一般定義為從協調世界時(UTC時間)1970年1月1日0時0分0秒起至現在的總秒數(10位是精確到秒,13位是精確到毫秒)。考慮到閏秒的話,更精確的定義為從協調世界時(UTC時間)1970年1月1日0時0分0秒起至現在經過閏秒調整之后的總秒數
- GPS時間:它是GPS原子時,它的時間基準是1980年1月6日0時0分0秒與世界協調時刻UTC相一致,以后按原子時TAI秒長累積計時。GPS時間跟UTC時間之差為秒的整倍數(因為UTC比TAI慢,而GPS是按照TAI來計時的,所以UTC也比TAI慢)。如1989年為5秒,1996年為11秒,2002年為13秒,到現在2020年08月為止為18秒。
閏秒
它是在協調世界時(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可以查看每次閏秒的時間和第幾次閏秒,主要內容如下:
TAI、GPST、UTC換算
根據文件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個小時。時區又分為理論時區和法定時區
- 理論時區:按經度,每15°為一個時區,將地球劃分為24個時區,以本初子午線為中心,向東西兩側各延伸7.5°的區域為0時區
- 法定時區:法定時區是在理論時區的基礎上,根據某些地區的國界線做了調整之后的時區。為實際使用的時區。例如中國橫跨東五區到東九區五個時區,但統一使用東八區時間(北京時間)
- 時差:某個地方的時刻與0時區的時刻差稱為時差,時差東正西負。以本初子午線為中心,每向東一跨過一個時區,時刻增加一個小時,每向西跨過一個時區,時刻減少一個小時
- 國際日期變更線:大體以180度經線為日界線。當自西向東穿過日期變更線時,日期需要減少一天,反之,日期增加一天
UTC時間轉本地時間(東八區)
根據此代碼,修改最后一行fromtimestamp(timestamp, timezone(timedelta(hours=8)))即可實現UTC轉不同時區
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"# 得到不包含時區的datetimedt_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)本地時間(東八區)轉UTC
根據此代碼,修改replace(tzinfo=timezone(timedelta(hours=8)))即可實現某個時區轉UTC時間
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"# 得到不包含時區的datetimedt_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時間
將GPS時間轉換為UTC時間
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時間
將UTC時間轉換為GPS時間
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 // 7gpsdays = tdiff.days - 7*gpsweekgpsseconds = tdiff.seconds + 86400*(tdiff.days -7*gpsweek)return gpsweek, gpsdays, gpsseconds, tdiff.microseconds總結
以上是生活随笔為你收集整理的常用的几种时间系统GMT、UTC等以及使用Python代码GPS时间转UTC时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机云平台架构,基于虚拟化技术的云计算
- 下一篇: GridView日期列使用DataFor