時間時區概念及常用時間函式

2021-09-11 04:09:28 字數 3438 閱讀 7754

時區,為了克服時間上的混亂,2023年在華盛頓召開的一次國際經度會議(又稱國際子午線會議 )上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國(格林尼治天文台舊址)為中時區(零時區)、東1-12區,西1-12區,每個時區橫跨經度15度,時間正好是1小時。最後的東、西第12區各跨經度7.5度,以東、西經180度為界。每個時區的**經線上的時間就是這個時區內統一採用的時間,稱為區時,相鄰兩個時區的時間相差1小時。

硬體時鐘(又稱實時時鐘,也就是rtc),實時時鐘為作業系統提供了乙個可靠的時間,並且在斷電的情況下,rtc實時時鐘也可以通過電池供電,一直執行下去,用來儲存和同步計算機作業系統時間。rtc通過strb/ldrb這兩個arm指令向cpu傳送8位資料(bcd碼)。資料報括秒,分,小時,星期,天,月和年。rtc實時時鐘依靠乙個外部的石英晶體,產生週期性的脈衝訊號,每乙個訊號到來時,計數器就加1,通過這種方式,完成計時功能。

系統時鐘,作業系統認知的時間,包括時區資訊和utc時間(unix時戳均使用2023年1月1日0時0分0秒到目前的utc秒數)兩部分,時區資訊儲存在/etc/localtime檔案中,一般由/usr/share/zoneinfo/目錄下的時區檔案拷貝或鏈結而來(該目錄包含所有支援的時區檔案,修改時區其實是替換/etc/localtime檔案,而不是直接修改該檔案內容)。utc時間是unix系統所使用的標準時間,不同地區的人使用時顯示的本地時間由utc+時區而來(也可以說所有unix/linux作業系統的系統時間都相同,2023年1月1日0時0分0秒到目前的utc秒數)。

了解以上概念我們知道,計算機系統一般包括三個重要的時間(也是容易搞混的時間,通常我們所說的計算機時間應該指的是本地時間,使用者在第一次使用裝置時需要選擇時所在區),分別為硬體rtc時間,系統utc時間和本地local時間。三者有以下關係:

硬體rtc時間是在關機或掉電狀態能夠繼續儲存的,所以為主導地位,其他時間都可以由該時間計算得來(系統時間在作業系統執行起來後被rtc同步),rtc儲存的時間可以有兩種,一是utc時間,二是local時間,以東八區為例:

兩種設定都可以,沒有明確規定,不過一般windows和linux都預設rtc儲存local本地時間。

linux時間結構體定義:

struct tm

;int    tm_sec   代表目前秒數,正常範圍為0-59,但允許至61秒

int    tm_min   代表目前分數,範圍0-59

int    tm_hour   從午夜算起的時數,範圍為0-23

int    tm_mday   目前月份的日數,範圍01-31

int    tm_mon   代表目前月份,從一月算起,範圍從0-11

int    tm_year   從2023年算起至今的年數

int    tm_wday   一星期的日數,從星期一算起,範圍為0-6

int    tm_yday   從今年1月1日算起至今的天數,範圍為0-365

int    tm_isdst   日光節約時間的旗標

timeval結構定義為:

struct    timeval 

;timezone結構定義為:

struct    timezone

;linux常用時間函式介紹:

1、time(取得當前時間utc秒數,無時區轉換)

#include

time_t time(time_t *t);

這個函式應該算是最常用函式之一,返回utc標準秒數,沒有時區轉換,在倫敦和上海同時呼叫這個函式返回值相同。

2、gmtime(獲取當前時間結構,utc時間,無時區轉換)

#include

struct tm *gmtime(const time_t *timep);

struct tm *gmtime_r(const time_t *timep, struct tm *result);

這兩個函式意思一樣,將timep這個秒數轉換成以utc時區為標準的年月日時分秒時間。gmtime_r是執行緒安全的,推薦使用這個。gmtime返回的是乙個structtm*,這個指標指向乙個靜態的記憶體,這塊區域是會經常被改動的。你剛呼叫gmtime(),執行了其他幾條命令,然後想使用剛才gmtime()得到struct  tm,會發現內容不對了,所以很危險,使用gmtime_r後就沒有問題,gmtime_r會將結果儲存到你傳入的記憶體中。

3、localtime(獲取當前時間結構,本地時間,有時區轉換)

#include

struct tm *localtime(const time_t * timep);

struct tm *localtime_r(const time_t *timep, struct tm *result);

這兩個函式意思也一樣,會根據時區資訊得到本地時間,同樣建議使用localtime_r版本。

4、mktime(將時間結構轉換為utc秒數,有時區轉換)

#include

time_t mktime(struct tm *tm);

將已經根據時區資訊計算好的structtm轉換成time_t的秒數。計算出的秒數是以utc時間為標準的,跟呼叫time()得到的秒數是同乙個概念。

5、gettimeofday(獲取當前時間,utc時間,精度微妙,無時區轉換)

#include

#include

int gettimeofday(struct timeval *tv, struct timezone *tz);

這個timeval是相對time_t更精確的時間,包含了微妙數。tv_usec最大為999999,再加1則為1秒,超過1秒就進製到tv_sec。timezone一般傳入null,linux沒有處理timezone中的tz_dsttime資訊,所以在程式設計時不要從這裡獲取時區資訊。

6、ctime(將時間轉換為本地時間字串, 有時區轉換)

#include

char *ctime(const time_t *timep);

7、asctime(將時間轉換為字串, 無時區轉換)

#include

char *ctime(const time_t *timep);

char * asctime(const struct tm * timeptr);

**示例:

#include

#include

#include

int main(int argc, char* ar**)

執行結果:

timep = 1471929196, local time = tue aug 23 13:13:16 2016

tv.sec = 1471929196, tv.usec = 146952

gmtime_r = tue aug 23 05:13:16 2016

localtime_r = tue aug 23 13:13:16 2016

mktime localtime to utc = 1471929196

mktime localtime to utc = 1471900396

常用時間函式

比較常用的時間函式有time localtime asctime 和gmtime 函式time 的原型為 time t time time t time 函式time 返回系統的當前日曆時間,如果系統丟失時間設定,則函式返回 1。對函式time的呼叫,既可以使用空指標,也可以使用指向time t型別...

php 常用時間函式

php時間 time 來取得伺服器當前時間的時間戳 expiration time 2 3600 得到當前時間延遲2小時候的時間戳 失效驗證 略 計算當前頁面執行時間的例子 do something sleep 3 do something running time time server requ...

mysql常用時間函式

mysql常用的日期函式及用法如下 當前時間 select now 結果 2020 01 18 15 25 26 當前時間戳 select current timestamp 結果 2020 01 18 15 26 36 select current timestamp 結果 2020 01 18 ...