2012-04-10 169 views
0

我的時區是美國東部標準時間,它比UTC晚5個小時。假設:將UTC轉換爲本地

struct tm t = { 0, 30, 15, 10, 3, 112, 0, 0, -1 }; 
time_t utc_in_timet = _mkgmtime(&t); 

struct tm tt = { 0 }; 
localtime_s(&tt, &utc_in_timet); 

當localtime_s返回時tt關閉一小時。我在那裏11:30而不是10:30。

我錯過了什麼?

回答

1

我已經在我的機器上試過了你的代碼,它能正常工作(我的時區是GMT + 2)。由於您告訴系統自行檢查夏令時(tm的最後一個參數是-1),因此它實際上是使用EDT,因此會給您GMT-4。

您可以嘗試用2替換月份(3),以便日期爲3月10日,即夏令時更改之前;我敢打賭,在這種情況下你會得到預期的10:30。

+0

我也注意到了。將tm_isdst設置爲1幾乎具有相同的效果,對吧? – ForeverLearning 2012-04-10 16:05:56

+0

必須有一些通用的方式將UTC轉換爲當地時間,方法是將夏時制節能化,對吧? – ForeverLearning 2012-04-10 19:14:12

+0

是的,在這種情況下,將'tm_isdst'設置爲'1'會有相同的效果。 – Gorpik 2012-04-12 06:38:13

3

我認爲這與夏令時有關。你確定你的時區目前是EST(-5)嗎?因爲你的系統似乎應該使用EDT(-4)?

+0

我的時區最明確地設置爲EST。除此之外,即使一位同事在英國嘗試過,該代碼也會關閉一個小時。我相信它返回16:30當localtime_s返回(或14:30 - 我不記得哪個) – ForeverLearning 2012-04-10 15:34:52

+0

那麼,我也試過這個:http://www.timeanddate.com/worldclock/converter.html當我轉換到EST-New York,它會自動使用夏令時。我也對美國東部時間給出了這樣的警告:「目前只有部分地點位於東部時區,因爲大多數地方目前都有夏令時。」所以我真的認爲您使用的時區是夏令時(= EDT)的時區 – rve 2012-04-10 16:14:43

0

認爲問題是月份是3月:struct tm t = {0,30,15,10,,112,0,0,-1}; 然後,這是夏令時問題。但正如Gorpik指出的那樣,「月份從0到11,所以4月的確是3」。

所以,我查了一下 - 這顯示在海法18:30是正確的+ 2UTC。

+0

這是錯誤。在'tm'中,月份從0到11,所以4月確實是'3'。 – Gorpik 2012-04-10 15:49:29

+0

是的,只是想刪除帖子。但你輸入得更快。 – SChepurin 2012-04-10 15:51:06

+0

對不起:) – Gorpik 2012-04-10 15:55:39

1

驗證您的本地時區。英格蘭(如倫敦)和美國東海岸目前都是夏令時,所以這看起來是問題(正如已經提到的人)。對於美國東海岸來說,美國東部時間有4小時不同。

相關問題