2010-05-05 44 views
3

我目前正在將一些Cocoa(Apple的Objective-C API)代碼遷移到C,以便使其可用於其他操作系統,如GNU/Linux。在C中使用時區

在可可中,有很多很棒的東西,例如使用timeZoneWithAbbreviation:從字符串描述符中創建NSTimeZone對象。這使我可以使用「歐洲/巴黎」等值來輕鬆創建NSTimeZone對象。 對我來說,另一個重要的方法是secondsFromGMTForDate:,因爲它會自動爲您考慮DST規則。

現在,我發現C最接近NSTimeZone的是struct timezone(請參閱here)。但是,我沒有看到如何在特定的時間和時區內輕鬆獲得GMT「偏移」的秒數。如果您只有像「歐洲/巴黎」這樣的描述,我也不知道如何獲得時區結構。

回答

2

不幸的是,你正步入困境。沒有一個好的,廣泛可用的時區圖書館沒有附加到其他重大項目。您可以查看Olson數據庫(時區)隨附的代碼,您可以查看ICU(Unicode的國際化組件)。

+1

可可使用ICU,所以ICU應該給你等同的行爲。 – 2010-05-05 20:44:30

4

以下是我的理解,可能是錯誤的...

我不知道OS X是怎麼做的,但在Linux上,標準C時區功能使用Olson database,這真的是相當厲害(因爲它具有區域設置描述的完整列表並跟蹤歷史時區規則以及當前規則)。請致電tzset。該功能由其他與時間相關的功能自動調用,但您可以通過設置TZ環境變量然後調用tzset,從系統默認值手動指定不同的時區。例如:

int main(int argc, char *argv[]) { 
    time_t t = time(NULL); 
    printf("%s\n", ctime(&t)); 

    setenv("TZ", "America/Chicago", 1); 
    printf("%s\n", ctime(&t)); 

    return 0; 
} 

調用tzset也設置了timezone全局變量,你可以用它來找到GMT以秒爲抵消當前時區。

這些函數只允許您一次使用一個時區,儘管所有這些(除可能的timezone全局變量除外)都應該是標準C,但Linux以外的平臺可能不會完全支持區域列表,夏令時更改等。如果您發現這不符合您的需求,則可嘗試使用第三方庫,例如隨[Olson數據庫]或ICU的TimeZone class(也可從C使用)分發的代碼, 。