簡體   English   中英

解釋struct tm中的tm_isdst字段

[英]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_ydaytm_wday除外)並調用mktime() 它會將所有字段調整到通常范圍,包括將tm_isdst設置為0或1。


  1. 對於日期(YYYY-MM-DD)2016-03-16(當DST生效時),tm_isdst應為1嗎? 還是0?

     // set to 1 to indicate DST tm.tm_isdst = 1; 
  2. 對於日期(YYYY-MM-DD)2016-01-16(當DST沒有生效時),tm_isdst應該是1嗎? 還是0?

     // set to 0 to indicate standard time tm.tm_isdst = 0; 
  3. 夏令時(美國)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 
  4. 有沒有辦法檢查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. 它應該是1 (或正值),因為正如你所說,DST有效。

  2. 它應該是0 ,因為正如你所說,DST不起作用。

  3. 它應該是0 ,因為DST當時沒有生效。

  4. 您可以使用localtime()在給定時間內填充struct tm ,然后檢查該標志的值是什么。 這主要是為什么它在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM