[英]Interpretation of tm_isdst field in struct tm
時間結構(struct tm)包含分解為其組件的日歷日期和時間。 該結構包含9個int類型的成員(按任意順序),它們是:
Member Type Meaning Range
tm_sec int seconds after the minute 0-61*
tm_min int minutes after the hour 0-59
tm_hour int hours since midnight 0-23
tm_mday int day of the month 1-31
tm_mon int months since January 0-11
tm_year int years since 1900
tm_wday int days since Sunday 0-6
tm_yday int days since January 1 0-365
tm_isdst int Daylight Saving Time flag
如果夏令時生效,夏令時標志(tm_isdst)大於零,如果夏令時沒有生效,則為零,如果信息不可用,則小於零。
我與tm_isdst相關的具體問題如下:
(1)對於2016-03-16的日期(YYYY-MM-DD)(當夏令時生效時),tm_isdst應為1嗎? 還是0?
(2)對於2016-01-16的日期(YYYY-MM-DD)(當夏令時沒有生效時),tm_isdst應該是1嗎? 還是0?
(3)夏令時(美國)2016年3月13日星期日凌晨2點開始。所以在3月13日凌晨1點45分,tm_isdst會有什么價值? 誰設置了這個標志值以及如何?
(4)有沒有辦法檢查DST何時從某個系統調用生效?
關鍵的問題是,一個struct tm
代表時間戳和領域並不局限於24小時12個月第60分鍾,等DST字段沒有匹配在時區該日期使用的時鍾。 當然,設置為非常規值需要對許多應用進行修正。
對於本地時間戳,簡單設置所有字段(不需要設置tm_yday
和tm_wday
除外)並調用mktime()
。 它會將所有字段調整到通常范圍,包括將tm_isdst
設置為0或1。
對於日期(YYYY-MM-DD)2016-03-16(當DST生效時),tm_isdst應為1嗎? 還是0?
// set to 1 to indicate DST tm.tm_isdst = 1;
對於日期(YYYY-MM-DD)2016-01-16(當DST沒有生效時),tm_isdst應該是1嗎? 還是0?
// set to 0 to indicate standard time tm.tm_isdst = 0;
夏令時(美國)2016年3月13日星期日凌晨2點開始。所以在3月13日凌晨1點45分,tm_isdst會有什么價值? 誰設置了這個標志值以及如何?
使用tm.tm_isdst = -1;
調用mktime()
tm.tm_isdst = -1;
不確定DST設置時。 如果代碼知道 struct tm
是標准時間,則將tm_isdst
字段設置為0.一年中的哪個時間沒有任何區別 。 與DST類似,如果代碼知道它是DST時間戳,則將字段設置為1.調用mktime()
會將字段調整為本地時區的常用設置。
當然1:45 AM( tm_isdst < 0
)可以解釋為任何一種方式, mktime()
通常會選擇0或1。
// set to 1 to indicate DST // set to 0 to indicate standard time // set to -1 to indicate DST is not known tm.tm_isdst = -1; mktime(&tm); // This will adjust all the fields including tm_isdst
有沒有辦法檢查DST何時從某些系統調用生效?
是。 要確定struct tm
是否應將tm_isdst
為0或1,請調用mktime()
mktime(&tm); // This will adjust the fields including tm_isdst printf("%d\\n", tm.tm_isdst);
順便說一句:健壯的代碼檢查mktime()
的返回值
if (mktime(&tm) == -1) puts("Oops");
它應該是1
(或正值),因為正如你所說,DST有效。
它應該是0
,因為正如你所說,DST不起作用。
它應該是0
,因為DST當時沒有生效。
您可以使用localtime()
在給定時間內填充struct tm
,然后檢查該標志的值是什么。 這主要是為什么它在那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.