2014-03-13 44 views
0

我喜歡根據秒數來計算當地時間(在某個時區)和GMT之間的差異。我使用下面的代碼片段:如何在Solaris上的C++中瞭解GMT和本地時間的區別?

time_t now = time(0); // GMT 
time_t gmnow = mktime(gmtime(&now)); // further convert to GMT presuming now in local 
time_t diff = gmnow - now; 

但是,我得到了一個錯誤的區別。 我在這裏做的是通過時間(0)將當前時間查詢爲GMT。然後假設這是一個本地時間,我調用gmtime來添加GMT差異因子並使用mktime重新轉換爲本地時間。這應該顯示了GMT和我的時區的差異,但它顯示了1小時(夏令時)的額外差異。

例如,我現在的時間是週四年03月13 4時54分45秒EDT 2014 當我獲得當前時間GMT,這應該是: 週四年03月13 8點55分34秒格林尼治標準時間2014 考慮到這是當前如果我打電話給gmtime,這應該會進一步進行,重新轉換應該給我4小時的差異,但是我得到5小時的差異。

gmtime的用法在這裏是錯的嗎? 另外,如何知道當前時區以及夏令時?

+0

與'時間(0)'你得到的是UTC時間不是格林威治標準時間 –

+0

@ elvis.dukaj是的,正確的,但即使如此,我的目標是要知道GMT和當前時間與夏令時調整的差異(如果有的話)。請檢查我的答案 –

回答

0

Got it!

下面的代碼片段會解決這個問題:

time_t now = time(0); // UTC 
time_t diff; 
struct tm *ptmgm = gmtime(&now); // further convert to GMT presuming now in local 
time_t gmnow = mktime(ptmgm); 
diff = gmnow - now; 
if (ptmgm->tm_isdst > 0) { 
    diff = diff - 60 * 60; 
} 

關鍵是要檢查tm_isdst的標誌,如果適用,如果設置,調整一個多小時diff的 這工作。 感謝您的所有時間。

+0

這適用於大多數情況。有一個(非常小的,罕見的)一套觀察除1小時DST變化以外的地方。 – Petesh

+0

@Petesh在運行代碼部分時,這可能是任何問題,DST生效之前,就在time_t gmnow = mktime(ptmgm)調用之後? –

+0

我認爲在春季前進的情況下可能存在一個問題,那裏只有一小時,在當地時間「根本不存在」 - 你必須親自測試才能確定;但對於倒退的情況;我認爲它是由'tm_isdst'標誌覆蓋的。對於[兩種情況下的UTC偏移量的秒數],Solaris都有變量'altzone'和'timezone'(http://docs.oracle.com/cd/E19253-01/816-5168/6mbb3hrfk/index.html) 。 – Petesh

相關問題