[英]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_wday
和tm_yday
組件的原始值將被忽略,其他組件的原始值不限於上述范圍。 276成功完成后,將適當設置結構的tm_wday
和tm_yday
組件的值,並將其他組件設置為代表指定的日歷時間,但是將其值強制設置為上述范圍內; 的最終值tm_mday
未設置直到tm_mon
和tm_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.