2009-09-09 60 views
4

我想在DST轉換期間4小時後計算DST或DST轉換期間的時間。如何確定CST中DST轉換期間的時間間隔

目前這樣做:

DateTime now = DateTime.now(); 
DateTime later = now.AddHours(4); 
System.Console.WriteLine(now + " isDST " + now.IsDaylightSavingTime()); 
System.Console.WriteLine(later + " isDST " + later.IsDaylightSavingTime()); 

提供:

11/1/2009 12:45:54 AM isDST True 
11/1/2009 4:45:54 AM isDST False 

我想看到的是:

11/1/2009 12:45:54 AM isDST True 
11/1/2009 3:45:54 AM isDST False 

「最好」 的辦法我發現這樣做是通過UTC這樣一個往返:

DateTime now = DateTime.now(); 
DateTime later = now.ToUniversalTime().AddHours(4).ToLocalTime; 
System.Console.WriteLine(now + " isDST " + now.IsDaylightSavingTime()); 
System.Console.WriteLine(later + " isDST " + later.IsDaylightSavingTime()); 

看來我應該能夠指定AddHours()返回的時間應該是經過的時間或顯示時間。我錯過了什麼?

回答

2

我不認爲你錯過了任何東西。這聽起來像日期時間可以有一個更好的文檔或更豐富的界面,但MSDN recommends using UTC完全像你一樣。

從不同的夏令時規則中顯示時間與現在相比,.NET和win32之間存在可愛的時差。 .NET將顯示當時顯示的時間,而win32將始終以當前的夏令時標誌顯示時間。

2

AddHours()涉及TimeSpans,它沒有真正的「顯示時間」或甚至時區的概念。它基本上是整數個滴答。

我認爲如果我正確理解你的意圖,你正在做的是一個很好的處理方法。

2

是的,你應該使用UTC。

在當前時刻4小時後,您正在有效地討論即時。如果您願意,當地時間不是4小時,而是「經驗豐富」時間4小時。 (讓我們把相對性置之不理。)想象一個人打電話給另一個人說:「我會在4個小時內再打給你」 - 兩個人都會知道這意味着什麼,即使他們處於不同的DST轉換時區參與其中。

即時通常最好用UTC表示,以避免混淆 - 它們天生就是「通用」,而不是在特定的時區。

我會避免使用本地時間,直到你需要它:

DateTime localTimeInFourHours = DateTime.UtcNow.AddHours(4).ToLocalTime; 

或者你可以使用DateTimeOffset如果你想在一個時區中的「本地時間」比一個電腦上的其他落得被設定爲。

相關問題