2011-02-10 60 views
5

爲.NET DateTime.ToLocalTime方法狀態的文檔:DateTime.ToLocalTime在Windows XP

在Windows XP系統中,ToLocalTime從 UTC本地時間轉換時 方法只識別當前 調整規則。因此, 之前的 當前調整規則進入 之前的期間轉換可能無法準確反映UTC和本地時間之間的差異 。

我在Windows 7上開發,但部署到混合環境。我如何提供與ToLocalTime的Windows 7行爲相匹配的一致且正確的實現?

EDIT

我跑了測試:

static void Main() 
{ 
    // 8 AM in July, UTC. That would have been DST, so 3 AM CDT. 
    var dstDate = new DateTime(2010, 7, 1, 8, 0, 0, DateTimeKind.Utc); 

    // 8 AM in December, UTC. Not DST, so 2 AM CST. 
    var nonDstDate = new DateTime(2010, 12, 1, 8, 0, 0, DateTimeKind.Utc); 

    Log("DST Date ToLocalTime: " + dstDate.ToLocalTime()); 
    Log("DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(dstDate)); 
    Log("Expected: 3 AM July 1 2010"); 

    Log(string.Empty); 

    Log("Non-DST Date ToLocalTime: " + nonDstDate.ToLocalTime()); 
    Log("Non-DST Date ConvertTimeFromUtc: " + ConvertTimeFromUtc(nonDstDate)); 
    Log("Expected: 2 AM December 1 2010"); 

    Log(string.Empty); 

    Log("Date ToLocalTime Kind: " + dstDate.ToLocalTime().Kind); 
    Log("Date ConvertTimeFromUtc Kind: " + ConvertTimeFromUtc(dstDate).Kind); 
} 

private static void Log(string message) 
{ 
    Console.WriteLine(message); 
} 

private static DateTime ConvertTimeFromUtc(DateTime utcDateTime) 
{ 
    return 
     DateTime.SpecifyKind(
      TimeZoneInfo.ConvertTimeFromUtc(
       utcDateTime, 
       TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id)), 
      DateTimeKind.Local); 
} 

結果爲下XP專業版32位,SP3(如VM)和Windows相同 7企業64位:

DST Date ToLocalTime: 7/1/2010 3:00:00 AM 
DST Date ConvertTimeFromUtc: 7/1/2010 3:00:00 AM 
Expected: 3 AM July 1 2010 

Non-DST Date ToLocalTime: 12/1/2010 2:00:00 AM 
Non-DST Date ConvertTimeFromUtc: 12/1/2010 2:00:00 AM 
Expected: 2 AM December 1 2010 

Date ToLocalTime Kind: Local 
Date ConvertTimeFromUtc Kind: Local

文檔是否錯誤?我可以簡單地調用ToLocalTime嗎?

EDIT 2

我們跑這一個實際的XP系統(而不是VM)上,得到了相同的結果有作爲。我的測試用例是否正確?任何人都可以提供結果不同的情況嗎?

回答

5

在Windows XP系統中,ToLocalTime 方法從 UTC本地時間轉換時,只識別當前 調整規則。因此, 之前的 當前調整規則進入 之前的期間轉換可能無法準確反映UTC和本地時間之間的差異 。在四月末的最後一個星期日開始第一個星期天到10月:

美國改變了調整規則DST在2007年

  • 2006年。
  • 2007年:3月的第2個星期天開始,11月的第1個星期天結束。

錯誤在於他們遵循所有日期的2007年規則,而不僅僅是2007年之後的日期.DST規則在20年內沒有改變,Windows XP並沒有不同規則的概念不同年份。它將考慮2006年10月31日在夏令時,實際上不是。

如果你只處理2007年後的日期,那麼你很棒,不需要做任何特別的事情。如果您在2006年或之前處理日期,那麼您需要檢查年份,並手動應用DST抵消。

+0

啊!當他們談到調整規則時,我認爲他們的意思是「我現在應該使用DST調整」。我剛剛發現這個[link](http://www.techrepublic.com/article/what-net-developers-need-to-know-about-daylight-saving-time-changes/6160501),說你是正確的。謝謝! – TrueWill

1

您可以使用System.TimeZoneInfo.ConvertTime(DateTime,TimeZoneInfo,TimeZoneInfo)方法將時間從源時區轉換爲用戶的本地時區。

+0

+1指向我在正確的方向,但這只是答案的一半。我在[link](http://msdn.microsoft.com/en-us/library/system.timezoneinfo.local.aspx)上找到了WinXP筆記。也許'TimeZoneInfo.ConvertTimeFromUtc(utcDate,TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id))'? – TrueWill