簡體   English   中英

給定日期/時間作為字符串,什么時候知道它是否是DST的最佳方法是什么?

[英]Given a Date/Time as a string, what is the best way to know if it was DST at that time?

假設我給了這樣一個字符串: "2009-4-9" ,意思是2009年4月9日。假設對於初學者來說,我只關心本地時間(我也關心其他時區,但是我先解決簡單的問題)。 知道夏令時是否生效的最佳方法是什么?

您可以假定系統具有正確更新的時區文件,例如/etc/localtime而我對便攜式解決方案感興趣。 也可以使用c或c ++。

您還可以假設我只關心過去或現在的日期,而不關心將來。

目前,我有一個類似這樣的“ hack”(我知道localtime_r是一個庫擴展,但是它與我可以移植的功能足夠接近)

struct tm tm;
// convert the time string to a broken down structure in localtime
if(strptime("2009-4-9", "%Y-%m-%d", &tm)) {
    // convert the broken down structure into seconds since epoch
    const time_t t = mktime(&tm);

    // convert it back to a broken down structure, this seems pointless at first...
    // but libc will fill out fields such as tm_isdst
    localtime_r(&t, &tm);

    printf("DST : %d\n", tm.tm_isdst);
}

雖然這種方法有效(而且似乎是一種非常有效的方法),但我覺得來回轉換很愚蠢。 有沒有更好的辦法?

您根本不需要調用localtime_r() mktime()對傳遞的struct tm進行tm_isdst ,包括將tm_isdst設置為-1將其設置為非負值。 因此,您需要做的是:

struct tm tm = { 0 };
// convert the time string to a broken down structure in localtime
if(strptime("2009-4-9", "%Y-%m-%d", &tm)) {
    tm.tm_isdst = -1;
    // normalise the broken down structure - this calculates tm_isdst
    mktime(&tm);

    printf("DST : %d\n", tm.tm_isdst);
}

C標准要求mktime()這種行為; 例如,C99說:

mktime函數將timeptr指向的結構中的分解時間(表示為本地時間)轉換為日歷時間值,該時間值的編碼方式與time函數返回的值相同。 該結構的tm_wdaytm_yday組件的原始值將被忽略,其他組件的原始值不限於上述范圍。 276成功完成后,將適當設置結構的tm_wdaytm_yday組件的值,並將其他組件設置為代表指定的日歷時間,但是將其值強制設置為上述范圍內; 的最終值tm_mday未設置直到tm_montm_year被確定。

腳注276明確地tm_isdst成員:

276)因此, tm_isdst的正值或零值會導致mktime函數最初假定夏令時在指定時間內有效。 負值會使它嘗試確定指定時間的夏令時是否有效。

從UTC到本地時間的轉換是可逆的。 例如,在秋天,時鍾跳回一個小時,當地時間02:00到03:00之間發生兩次。 給定此時間間隔的時間,就無法確定本地時間是否發生在當地夏令時的特定UTC時間或本地標准時間的一小時之后。

我以前在C語言中做過很多時間轉換,我想您幾乎也可以像我那樣做。 據我所知,localtime_r及其親屬可能是您唯一的選擇(除非有一些第三方日期庫。)當然,Greg Hewgill對於時間切換之間的“灰色時段”是正確的。

暫無
暫無

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

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