其它 關於時間函式mktime函式夏令時的問題

2021-09-24 17:54:38 字數 1900 閱讀 1233

在很多應用中,我們會用mktime函式進行時間準換操作,但這裡面有乙個夏令時的操作問題

我們的最終目的是把字串格式的時間轉換為內部使用的「日曆時間」,即到utc 2023年1月1日零時的秒數。這裡就存在夏令時的問題。比如俄羅斯時間2023年10月26日2:30由於夏令時的跳變會經過兩次,這兩次所代表的「日曆時間」明顯不同。如果仍按照上面的程式,由mktime()函式來決定這個時間是否處於夏令時(它會根據當前時區自動判斷,在沒有發生時間重疊的情況下處理是正確的)就會有問題。這時我們不能使用ttm.tm_isdst = -1了,而是明確使用ttm_tm_isdst = 1來告知mktime()現在處於夏令時,明確使用ttm.tm_isdst = 0來告知未處於夏令時。

結論:使用字串時間表示時一定要有標記表示這個時間是否處於夏令時,推薦在時間字串後面新增dst或者加上時區。否則,無法正確處理夏令時情況。如果時間字串表示的是utc時間,則無需上述處理過程。

mktime各種情況測試一下

在支援不支援夏令時時區,夏令時區間,非夏令時區間,切入夏令時丟失小時時,切出夏令時重複小時時。。tm_isdst 的不同作用

mktime是用於生成指定的本地時刻的,多數情況下我們都會把tm_isdst設定為-1,這樣子可以把指定時刻是否為夏令時交由系統判斷.不過實際應用中發現,對於切出夏令時時出現的重複小時,乙個小時處於夏令時,乙個小時不處於夏令時,因為我們沒有指定是否處於夏令時,這時得到的結果便不穩定,可能是處於夏令時的小時,也可能是處於非夏令時的小時.

下面是測試結果:

tm中tm_isdst分別為0,1,-1對mktime結果影響.

tm_isdst = -1(由系統判斷)

對於切入夏令時丟失的小時前的小時,生成時間為指定時間.

對於切入夏令時丟失的小時,生成時間為指定小時後面乙個小時(不受前面mk結果影響)

對於切入夏令時丟失的小時後的小時,生成時間為指定時間.

對於切出夏令時重複的小時前的小時,生成時間為指定時間.

對於切出夏令時重複的小時,生成時間受前面mk結果影響,倘若前次mk時間結果處於夏令時,則結果為處於夏令時的那個小時;倘若前次mk時間結果不處於夏令時,則結果為不處於夏令時的那個小時;

對於切出夏令時重複的小時後的小時,生成時間為指定時間.

tm_isdst = 0(指定為非夏令時)

對於切入夏令時丟失的小時前的小時,生成時間為指定時間.

對於切入夏令時丟失的小時,生成時間為指定小時後面乙個小時(不受前面mk結果影響)

對於切入夏令時丟失的小時後的小時,生成時間為指定時間後面乙個小時.

對於切出夏令時重複的小時前的小時,生成時間為指定時間後面乙個小時.

對於切出夏令時重複的小時,生成時間為不處於夏令時的那個小時;

對於切出夏令時重複的小時後的小時,生成時間為指定時間.

tm_isdst = 1(指定為夏令時)

對於切入夏令時丟失的小時前的小時,生成時間為指定時間前面乙個小時.

對於切入夏令時丟失的小時,生成時間為指定小時後面乙個小時(不受前面mk結果影響)

對於切入夏令時丟失的小時後的小時,生成時間為指定時間.

對於切出夏令時重複的小時前的小時,生成時間為指定時間.

對於切出夏令時重複的小時,生成時間為處於夏令時的那個小時;

對於切出夏令時重複的小時後的小時,生成時間為指定時間前面乙個小時.

倘若mktime傳入時間因為夏令時存在兩個,那mktime會認為該時間可能處於夏令時也可能處於非夏令時。是否處於夏令時由mktime生成的上乙個時間決定,倘若上乙個時間處於夏令時則生成的該重複時間是處於夏令時的,否則生成的該重複時間是處於非夏令時的。程式內部的原因是它在mktime中用乙個靜態變數儲存夏令時狀態,下次生成時間是優先以儲存的狀態來生成時間。

倘若mktime乙個不存在的夏令時(出現夏令時切換時丟失的那個小時)會直接生成丟失小時的下乙個小時。這個結果是確定的穩定的。

mysql sql時間函式 SQL獲取時間函式

sql獲取時間函式 datediff 引數一,引數二,引數三 引數一 year month day 引數二 比較的起始日期,預設1900 1 1 引數三 比較的日期。eg datediff year,0,getdate 表示比較0 預設1900 1 1 到當前的日期想差幾年 select datea...

mysql時間函式中文 Mysql的時間函式

1.本週內的第幾天,從週日開始 mysql select dayofweek 2015 05 25 dayofweek 2015 05 25 2 1 row in set 0.00 sec 2.本月內的第幾天 mysql select dayofmonth 2015 05 25 dayofmonth...

使用mktime 函式取得乙個日期的時間戳

2.8.3 使用mktime 函式取得乙個日期的時間戳 mktime 函式用於取得乙個日期的unix 時間戳,其宣告如下 int mktime int hour int minute int second int month int day int year int is dst 根據給出的引數返回...