時間處理時實際專案中經常碰到的問題,這裡介紹最常用的時間處理函式。
首先介紹基本的時間概念。時間一般分為兩種,一種是本地時間(local time),一種是協調世界時間(coordinated universal time ,utc),也就是傳說中的格林威治時間。本地時間與utc時間之間的差即為時差,比如,北京時間(東八區)比utc時間晚8個小時。
c執行庫中處理時間的函式主要是這四個:
[cpp]view plain
copy
time_t
time(
time_t
*timer);
time_t型別為32位或64位整型,具體型別由編譯系統決定。此函式用來獲得從2023年1月1日子夜(這個時刻在不同的crt實現中可能會不一樣)到當前時刻以來所流逝的時間,以秒為單位。這個時間差叫做日曆時間(calendar time )。
這是當然讓我困惑的地方:這個特殊的時刻——2023年1月1日零時零分零秒——是指本地時間呢,還是utc時間呢?我認為是本地時間,也就是各個時區自己的2023年1月1日零時零分零秒。可以設想這樣一種情況,如果全球24時區各有一台電腦,都依次在自己所在時區的本地時間2023年1月1日零時1分零秒呼叫time函式,那麼返回值都是60。注意,這裡是依次呼叫(事實上是每隔1小時),而不是想象中的同時呼叫,這是因為相鄰時區的同一本地時間,總是相差1小時。
當然,time_t型的時間方便計算機處理,但普通使用者無法理解這種數字。所以我們通常需要將time_t型時間轉換成我們平常所見的年月日形式。crt中為此定義了tm結構。
[cpp]view plain
copy
struct
tm;
注釋中已詳細解釋了各個欄位的用法。顯然這個結構中的字段對使用者更有意義。我們通常用localtime_s函式將time_t時間轉換為tm時間。
[cpp]view plain
copy
errno_t localtime_s(
struct
tm* _tm,
const
time_t
*time);
其中第二個引數為傳入的time_t時間,第乙個引數為返回的tm時間。由函式名可看出,返回的tm時間表示的是本地時間。當然,我們有時候也需要獲得對應的utc時間,這時我們需要gmtime函式。
[cpp]view plain
copy
errno_t gmtime_s(
struct
tm* _tm,
const
time_t
* time);
後面我們會看到兩者的區別。
我們知道了如何將time_t時間轉換為tm時間。同樣,我們會需要將tm表示的時間轉換為time_t時間。這時我們需要mktime函式。
[cpp]view plain
copy
time_t
mktime(
struct
tm*timeptr);
此函式返回從"特殊時刻"到引數表示的時刻之間流逝的日曆時間。另外還有個很好用的特性,就是它能修正傳進來的tm結構中各字段的取值範圍。比如,如果你將tm.tm_mon設為1,tm.tm_day設為33,然後以其為引數呼叫mktime函式,此函式會將tm.tm_mon修正為2,tm.tm_day修正為2。具體用法參照msdn。
我們來分析下面示例**:
[cpp]view plain
copy
#include
#include
#include
intmain()
輸出結果如下:
上面**中,11行time函式獲得從"特殊時刻"到當前時刻的日曆時間,如輸出結果中的第一行顯示的1267192581秒。
14行localtime_s函式將日曆時間轉換為本地tm時間,如輸出結果第二行。
18行gmtime_s函式將將日曆時間轉換為對應的utc的tm時間,如輸出結果第三行顯示。很容易看出,第二,三行輸出的時間相差8小時,因為我在東八區。如果你修改自己電腦的時區(在控制面板的date and time中修改),再執行此程式,比較兩次的執行結果,你就可以更好的理解了。
22行mktime函式將tm時間轉換為日曆時間,輸出結果中第四行顯示的結果與第一行一樣,這是必須的。。。
CRT中的時間 time t和tm
時間處理時實際專案中經常碰到的問題,這裡介紹最常用的時間處理函式。首先介紹基本的時間概念。時間一般分為兩種,一種是本地時間 local time 一種是協調世界時間 coordinated universal time utc 也就是傳說中的格林威治時間。本地時間與utc時間之間的差即為時差,比如,...
Java TM 中TM的意思
tm不一定代表註冊商標tm是trademark的縮寫,美國通常在商品上加註tm表示該文字或圖案是商標,並不一定是指已註冊商標。美國對商標的保護原則是使用在先原則,只要使用在先,就受到保護,所以使用者一般不註冊。而r是register的縮寫,用在商標上是指註冊商標。我國 商標法實施條例 第三十七條規定...
time t和struct tm之間的轉化
time t和struct tm之間的轉化 time t和struct tm結構體 1 ubuntu man文件對time t的解釋 從utc 1970年1月1日0時0分0秒開始經過的描述。例如time t tt 2 可以認為是從utc 1970年1月1日0時0分0秒開始經過了2秒的時間。2 ubu...