1 前言
在嵌入式系統(tǒng)中(包括大部分電子設(shè)備:手機(jī)、平板、手環(huán)、手表等等),時(shí)間的概念非常重要。如打印log時(shí)的時(shí)間戳、定時(shí)關(guān)機(jī)、心跳上報(bào)、日歷功能、鬧鐘等等。上述這些功能都需要一個(gè)相對(duì)精確的時(shí)間系統(tǒng)。
經(jīng)常涉及的與時(shí)間相關(guān)的術(shù)語包括:硬件時(shí)鐘、系統(tǒng)時(shí)鐘、網(wǎng)絡(luò)時(shí)鐘、時(shí)區(qū)修改和同步。日常生活和工作中可能接觸到的時(shí)區(qū)概念包括:UTC
、GMT
、CST
、DST
。在網(wǎng)絡(luò)時(shí)間中可能接觸到的概念又有:NTP
、SNTP
、NITZ
。本文將會(huì)對(duì)上述涉及到的概念進(jìn)行系統(tǒng)的整理和探討。
2 了解概念
下面對(duì)幾個(gè)概念進(jìn)行集中陳述。
2.1 時(shí)區(qū)
時(shí)區(qū)[1] 是指地球上的不同區(qū)域使用同一個(gè)時(shí)間定義。以前,人們通過觀察太陽的位置(時(shí)角)決定時(shí)間,這就使得不同經(jīng)度的地方的時(shí)間有所不同(地方時(shí))。1863年,首次使用時(shí)區(qū)的概念。通過設(shè)立一個(gè)區(qū)域的標(biāo)準(zhǔn)時(shí)間部分地解決了這個(gè)問題。
時(shí)區(qū)劃分規(guī)則:將全球按經(jīng)線從東到西劃分為24個(gè)時(shí)區(qū),其中東、西各12個(gè)時(shí)區(qū),每個(gè)時(shí)區(qū)跨越經(jīng)度15°,0區(qū)和12區(qū)跨越東西各7.5°。規(guī)定相鄰區(qū)域的時(shí)間相差1小時(shí),這樣24個(gè)時(shí)區(qū)剛好是24小時(shí),地球自轉(zhuǎn)一圈。如下圖是全球時(shí)區(qū)的劃分明細(xì)。常見的時(shí)區(qū)概念包括:GMT
、UTC
、CST
、DST
。
-
GMT(Greenwich Mean Time)指格林尼治標(biāo)準(zhǔn)時(shí)間,它是第一個(gè)世界時(shí)。
GMT 12:00
就是指格林尼治天文臺(tái)當(dāng)?shù)氐恼?2:00,而GMT+8 12:00,則是指東八區(qū)的北京當(dāng)?shù)貢r(shí)間的12:00。格林尼治標(biāo)準(zhǔn)時(shí)間的正午是指當(dāng)太陽橫穿格林尼治子午線時(shí)(也就是在格林尼治時(shí))的時(shí)間。由于地球在它的橢圓軌道里的運(yùn)動(dòng)速度不均勻,這個(gè)時(shí)刻可能和實(shí)際的太陽時(shí)相差16分鐘。 - UTC(Coordinated Universal Time)是指協(xié)調(diào)世界時(shí),又稱世界標(biāo)準(zhǔn)時(shí)間。它是以原子時(shí)為基礎(chǔ),由于現(xiàn)在世界上最精確的原子鐘50億年才會(huì)誤差1秒,所以UTC時(shí)間標(biāo)準(zhǔn)非常精確。每隔幾年協(xié)調(diào)世界時(shí)組織都會(huì)給世界時(shí)+1秒,讓基于原子鐘的世界時(shí)和基于天文學(xué)(人類感知)的格林尼治標(biāo)準(zhǔn)時(shí)間(GMT)相差不至于太大。UTC是現(xiàn)在世界使用的標(biāo)準(zhǔn)時(shí)間,UTC與GMT時(shí)間基本相同。
-
CST(China Standard Time)指中國(guó)標(biāo)準(zhǔn)時(shí)間。
GMT + 8 = UTC + 8 = CST
。 - DST(Daylight Saving Time)夏令時(shí),又稱:“日光節(jié)約時(shí)制”。是一種為節(jié)約能源而人為規(guī)定地方時(shí)間的制度,在這一制度實(shí)行期間所采用的統(tǒng)一時(shí)間稱為“夏令時(shí)間”。一般在天亮早的夏季人為將時(shí)間調(diào)快一小時(shí),可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個(gè)采納夏時(shí)制的國(guó)家具體規(guī)定不同。全世界有近110個(gè)國(guó)家每年要實(shí)行夏令時(shí)。中國(guó)現(xiàn)在已經(jīng)不再使用夏令時(shí)。
2.2 時(shí)鐘
常見的幾個(gè)時(shí)鐘概念包括:硬件時(shí)鐘、系統(tǒng)時(shí)鐘、網(wǎng)絡(luò)時(shí)鐘。
- 硬件時(shí)鐘。在嵌入式領(lǐng)域也就是RTC時(shí)鐘(Real Time Clock)。大多采用精度較高的晶振作為時(shí)鐘源。在主電源掉電時(shí),還可以工作,需要外加電池供電。通常把集成于芯片內(nèi)部的 RTC 稱為片內(nèi) RTC,在芯片外擴(kuò)展的 RTC 稱為外部 RTC。

-
系統(tǒng)時(shí)鐘。指軟件系統(tǒng)的時(shí)鐘。在
linux
和一些rtos
中,啟動(dòng)時(shí)會(huì)去讀取硬件時(shí)鐘(RTC),之后則獨(dú)立運(yùn)行。獨(dú)立運(yùn)行的好處對(duì)于普通用戶意義不大,但對(duì)于linux
網(wǎng)絡(luò)管理員卻有很大的用處。例如,要將一個(gè)很大的網(wǎng)絡(luò)中(跨越若干時(shí)區(qū))的服務(wù)器同步,假如位于美國(guó)紐約的linux
服務(wù)器和北京的Linux服務(wù)器,其中一臺(tái)服務(wù)器無須改變硬件時(shí)鐘而只需臨時(shí)設(shè)置一個(gè)系統(tǒng)時(shí)間,如要將北京服務(wù)器上的系統(tǒng)時(shí)間設(shè)置為紐約時(shí)間,兩臺(tái)服務(wù)器完成文件的同步后,再與原來的硬件時(shí)鐘同步一下即可。這樣系統(tǒng)時(shí)鐘和硬件時(shí)鐘就提供了更為靈活的操作。 -
網(wǎng)絡(luò)時(shí)鐘。網(wǎng)絡(luò)時(shí)鐘的時(shí)間源來自于專業(yè)授時(shí)的服務(wù)器(SNTP、NTP)。實(shí)現(xiàn)方案是在網(wǎng)絡(luò)上指定若干時(shí)鐘源服務(wù)器,為用戶提供授時(shí)服務(wù),并且這些服務(wù)器之間能夠相互比較校正,以提高準(zhǔn)確度。在移動(dòng)蜂窩網(wǎng)絡(luò)中,基站也可以通過無線網(wǎng)絡(luò)向移動(dòng)設(shè)備提供本地日期和時(shí)間、時(shí)區(qū)、夏時(shí)制偏移。網(wǎng)絡(luò)時(shí)鐘的精度一般都很高,可以達(dá)到毫秒級(jí),可以用來對(duì)嵌入式設(shè)備進(jìn)行時(shí)間同步。
2.3 時(shí)間同步
時(shí)間同步對(duì)嵌入式設(shè)備很重要,一些功能業(yè)務(wù)甚至依賴于時(shí)間信息來完成。如自注冊(cè)DM業(yè)務(wù),需要周期性的向運(yùn)營(yíng)商服務(wù)器上報(bào)信息,這些信息上報(bào)都是以天或者是月為周期,不可能靠軟件timer
來實(shí)現(xiàn)。和此類似的功能都需要以標(biāo)準(zhǔn)時(shí)間為基準(zhǔn),以此完成條件的觸發(fā)。下面來探討時(shí)間同步的話題。
2.3.1 SNTP
SNTP是簡(jiǎn)單網(wǎng)絡(luò)時(shí)間協(xié)議(Simple Network Time protocol)的簡(jiǎn)稱,它是目前Internet
網(wǎng)上實(shí)現(xiàn)時(shí)間同步的一種重要工程化方法。SNTP
由NTP
改編而來,SNTP
其實(shí)是NTP
的子集,只是NTP
可以 分發(fā)和授時(shí),而SNTP
只有授時(shí)沒有分發(fā),也就是說你只能從SNTP
獲取時(shí)間,其他的什么都做不了,SNTP
簡(jiǎn)化了NTP
的全部流程,這樣節(jié)約成本,但只能同步一個(gè)時(shí)間源。SNTP
協(xié)議采用客戶端/服務(wù)器的工作方式。SNTP
服務(wù)器通過接收GPS
信號(hào)或自帶的原子鐘作為系統(tǒng)的時(shí)間基準(zhǔn)。SNTP
客戶端(嵌入式設(shè)備)能夠通過定期訪問SNTP
服務(wù)器獲得準(zhǔn)確的時(shí)間信息,用于調(diào)整客戶端自身所在系統(tǒng)的時(shí)間,達(dá)到同步時(shí)間的目的。在linux
系統(tǒng)中一般有現(xiàn)成的SNTP客戶端可以安裝使用,在其他的嵌入式平臺(tái)上需要移植或自主開發(fā)。一些可用的SNTP服務(wù)器匯總?cè)缦?親測(cè)可以ping通):
- 國(guó)家授時(shí)中心 NTP 服務(wù)器:ntp.ntsc.ac.cn
- 阿里云公共 NTP 服務(wù)器:time.pool.aliyun.com
- 騰訊云公共 NTP 服務(wù)器:time1.cloud.tencent.com
-
教育網(wǎng)(高校自建)服務(wù)器:ntp.sjtu.edu.cn
2.3.2 NITZ
NITZ(Network Identity and Time Zone)是一種通過無線網(wǎng)絡(luò)向移動(dòng)設(shè)備提供本地日期和時(shí)間、時(shí)區(qū)、夏時(shí)制偏移,以及網(wǎng)絡(luò)提供商身份信息的機(jī)制,這通常用于無線蜂窩網(wǎng)絡(luò)設(shè)備(手機(jī)、通信模組)的自動(dòng)更新系統(tǒng)時(shí)間。對(duì)于其他網(wǎng)絡(luò)時(shí)間協(xié)議,NITZ的質(zhì)量和執(zhí)行力度都相對(duì)較弱。有些運(yùn)營(yíng)商根本就不支持,例如在國(guó)內(nèi),本地測(cè)試(廣東)發(fā)現(xiàn),中國(guó)移動(dòng)和中國(guó)電信是支持NITZ
的,中國(guó)聯(lián)通就根本不支持。再者,與SNTP
相比,SNTP
授時(shí)能使時(shí)間分辨率達(dá)到毫秒級(jí),NITZ
則“對(duì)于時(shí)間只能精確到數(shù)分鐘”。但NITZ
不用連上互聯(lián)網(wǎng),能駐上無線蜂窩網(wǎng)絡(luò)就行,而SNTP
必須連接互聯(lián)網(wǎng)。
3 應(yīng)用
3.1 linux中時(shí)間命令
linux命令中的date
命令是用來設(shè)置和查詢系統(tǒng)時(shí)間的,而hwclock
命令是用來設(shè)置和讀寫RTC
時(shí)間(硬件時(shí)間)。有一點(diǎn)需要注意,linux
的時(shí)間系統(tǒng)是由「新紀(jì)元時(shí)間」Epoch開始計(jì)算起,單位為秒,Epoch則是指定為1970年1月1日0點(diǎn)0分0秒,格林威治時(shí)間(GMT)。date +%s
命令可以讀取從1970年1月1日0點(diǎn)0分0秒開始到當(dāng)前的秒數(shù)。
- 讀取當(dāng)前秒數(shù)(以1970年1月1日0點(diǎn)0分0秒為計(jì)算起點(diǎn));
book@zhang.c:~$?date?+%s
1653752545
-
讀系統(tǒng)時(shí)間:
date
;
book@zhang.c:~$?date
Sat?May?28?2226?CST?2022
-
設(shè)置系統(tǒng)時(shí)間:
date -s "20220501 1200"
,date -s
命令設(shè)置時(shí)間只會(huì)影響系統(tǒng)時(shí)間,不會(huì)設(shè)置RTC時(shí)間,如果需要把當(dāng)前系統(tǒng)時(shí)間同步設(shè)置到RTC中,需要額外調(diào)用hwclock
命令;
book@zhang.c:~$?date?-s?"20220501?1200"
Sun?May??1?1200?CST?2022
-
有關(guān)
rtc
時(shí)間的操作,主要是hwclock
命令使用;
#讀取并打印當(dāng)前的rtc時(shí)間
hwclock?-r
#讀取RTC時(shí)間并設(shè)置到系統(tǒng)時(shí)間中去
hwclock?-s?
#把當(dāng)前的系統(tǒng)時(shí)間設(shè)置到RTC中
hwclock?-w?????
#完整的設(shè)置RTC的時(shí)間可執(zhí)行如下命令
date?-s?"20220501?1200"
hwclock?-w
-
date
命令格式化的顯示時(shí)間,可以看如下的Command
這一列。
????????Format/result???????????|???????Command??????????????|??????????Output
--------------------------------+----------------------------+------------------------------
YYYY-MM-DD??????????????????????|?date?-I????????????????????|?$(date?-I)
YYYY-MM-DD_hhss?????????????|?date?+%F_%T????????????????|?$(date?+%F_%T)
YYYYMMDD_hhmmss?????????????????|?date?+%Y%m%d_%H%M%S????????|?$(date?+%Y%m%d_%H%M%S)
YYYYMMDD_hhmmss?(UTC?version)???|?date?--utc?+%Y%m%d_%H%M%SZ?|?$(date?--utc?+%Y%m%d_%H%M%SZ)
YYYYMMDD_hhmmss?(with?local?TZ)?|?date?+%Y%m%d_%H%M%S%Z??????|?$(date?+%Y%m%d_%H%M%S%Z)
YYYYMMSShhmmss??????????????????|?date?+%Y%m%d%H%M%S?????????|?$(date?+%Y%m%d%H%M%S)
YYYYMMSShhmmssnnnnnnnnn?????????|?date?+%Y%m%d%H%M%S%N???????|?$(date?+%Y%m%d%H%M%S%N)
YYMMDD_hhmmss???????????????????|?date?+%y%m%d_%H%M%S????????|?$(date?+%y%m%d_%H%M%S)
Seconds?since?UNIX?epoch:???????|?date?+%s???????????????????|?$(date?+%s)
Nanoseconds?only:???????????????|?date?+%N???????????????????|?$(date?+%N)
Nanoseconds?since?UNIX?epoch:???|?date?+%s%N?????????????????|?$(date?+%s%N)
ISO8601?UTC?timestamp???????????|?date?--utc?+%FT%TZ?????????|?$(date?--utc?+%FT%TZ)
ISO8601?UTC?timestamp?+?ms??????|?date?--utc?+%FT%T.%3NZ?????|?$(date?--utc?+%FT%T.%3NZ)
ISO8601?Local?TZ?timestamp??????|?date?+%FT%T%Z??????????????|?$(date?+%FT%T%Z)
YYYY-MM-DD?(Short?day)??????????|?date?+%F(%a)?????????????|?$(date?+%F(%a))
YYYY-MM-DD?(Long?day)???????????|?date?+%F(%A)?????????????|?$(date?+%F(%A))
3.2 SNTP和NITZ
在手機(jī)(包括Android和功能機(jī))和模組產(chǎn)品中,SNTP
和NITZ
兩種同步系統(tǒng)時(shí)間的策略一般都會(huì)用到。默認(rèn)使用的是NITZ來獲取網(wǎng)絡(luò)時(shí)間,但是需要有運(yùn)營(yíng)商的支持才能使用(中國(guó)聯(lián)通就不支持),而有些設(shè)備產(chǎn)品只支持WIFI等無線網(wǎng)絡(luò),而不支持移動(dòng)網(wǎng)絡(luò),此時(shí)就需要采用SNTP
方式來獲取網(wǎng)絡(luò)時(shí)間進(jìn)行同步了。SNTP
協(xié)議時(shí)間戳是以1900年1月1日0點(diǎn)0分0秒為起點(diǎn),而linux
時(shí)間戳從1970年1月1日0點(diǎn)0分0秒開始記秒數(shù),即記錄到SNTP
結(jié)構(gòu)體中的時(shí)間包含了JAN_1970(從1900到1970共70年的秒數(shù))。在拿到SNTP
時(shí)間后,往linux同步時(shí)間時(shí),需要減掉JAN_1970。
4 總結(jié)
-
UTC
與GMT
時(shí)間基本相同; - 硬件時(shí)鐘和系統(tǒng)時(shí)鐘同步后,會(huì)分開獨(dú)立運(yùn)行;
-
網(wǎng)絡(luò)時(shí)鐘的精度都比較高,可以用
SNTP
或NITZ
來進(jìn)行同步,尤其SNTP
時(shí)間同步精度可以達(dá)到毫秒級(jí)。 -
linux
系統(tǒng)的計(jì)時(shí)起點(diǎn)為1970年1月1日0點(diǎn)0分0秒,其他嵌入式系統(tǒng)在做網(wǎng)絡(luò)時(shí)間同步時(shí),也一定要確認(rèn)好計(jì)時(shí)起點(diǎn)。
?
評(píng)論