2009-01-13 68 views
38

無論用戶的本地時區設置爲什麼,使用C#(.NET 2.0)我都需要確定東部時區中的時間(DateTime對象)。獲取另一個時區的日期時間,而不考慮當地時區

我知道這些方法,但似乎沒有成爲一個明顯的方式來獲得一個DateTime對象比用戶是在什麼不同的時區。

DateTime.Now 
DateTime.UtcNow 
TimeZone.CurrentTimeZone 

當然,該解決方案的需求夏令時意識到。

+0

請參閱http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay 2014-12-12 01:29:04

回答

8

正如其他人所提到的,.NET 2不包含任何時區信息。 的信息存儲在註冊表中,雖然和其相當瑣碎寫它周圍的包裝類:

SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \ Time區域

包含子鍵的所有時區。 TZI字段值包含時區的所有轉換和偏移屬性,但它全部填充到二進制數組中。最重要的位(偏壓和日光),存儲在位置0和分別int32s 8:

int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0); 
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8); 

這個頁面有一個合理的總結: http://burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm

1

如何

DateTime lclTime = DateTime.Now; 
DateTime ept = lclTime.ToUniversalTime().AddHours(
        IsEasternDaylightSavingTime(
         lclTime.ToUniversalTime())? -5: -4) 

,或者如果你已經有本地UTC,硬編碼值的春天正向只是

DateTime lclUtc = DateTime.UtcNow; 
DateTime ept = lclUtc.AddHours(
        IsEasternDaylightSavingTime(lclUtc)? -5: -4) 

使用靜態字典和回落日期爲美國東部時間下一個50年..這隻有300個字節左右...然後索引到那個以確定它是否是東海岸的夏令時...正如指出的那樣,您不在乎它是否在本地區的dST。 。

private static bool IsEasternDaylightSavingTime(DateTime utcDateTime) 
    { 
     // hard coded method to determine 
     // whether utc datetime is Eastern Standard time 
     // or Eastern Daylight Time 
    } 
+0

什麼如果你的位置不使用DST?然後IsDaylightSavingTime將返回false。 – 2009-01-13 22:39:29

+0

UTC不會受到DST的影響;當然,這是我們需要知道的東部DST,而不是當地人。 – 2009-01-13 22:40:00

+0

Got me ...我不知道是否可以爲計算機設置的不同時區創建時區對象。而且你不會在東部時間創建一個時區對象,以確定它是否存在DST ... – 2009-01-13 22:44:05

78

在.NET 3.5中,有TimeZoneInfo,它提供了很多這方面的功能; 2.0SP1有DateTimeOffset,但這種限制更多。

獲取UtcNow並添加固定偏移量是作業的一部分,但不是DST感知的。

所以在3.5,我認爲你可以這樣做:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time"); 

但這根本不存在2.0;抱歉。

6

從 - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

這樣一個時區的名字被發現,如果美國不斷從倫敦子午線浮動15度西部或東部。

DateTime timeUtc = DateTime.UtcNow; 
try 
{ 
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); 
    Console.WriteLine("The date and time are {0} {1}.", 
        cstTime, 
        cstZone.IsDaylightSavingTime(cstTime) ? 
          cstZone.DaylightName : cstZone.StandardName); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the Central Standard Time zone."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted."); 
} 
2

我會救你的時候,告訴你,沒有在.NET適當,2.0版本沒有辦法讓從該軟件上運行的一個不同的另一時區中的DateTime對象(其他比UTC)。

但是,這並不意味着沒有辦法在.net之外做到這一點。在TimeZoneInformation類中查看here。此類將一些p/invoke內容包裝到Win O/S中以從O/S獲取時區信息。當2.0是新的並且它工作得非常好時,我成功地使用了它。我工作的網站必須能夠向用戶顯示本地的每個日期/時間,並且必須具有DST意識,並且這個班級爲我們填寫了賬單。

0

一個日期比較是一個日期比較。 DateTime只是封裝了一個以tick爲單位定義的內存結構,並使訪問內存常用部分的方法成爲可能,例如一天或一年的時間或的TimeOfDay等

而且轉換是唯一可能的,如果你知道這兩個源SND目的地偏移,然後計算總是給出由-1 * (sourceOffset - destOffset)

凡在括號中的部分表示給定時區差異。

另請參閱

Get eastern time in c# without converting local time

相關問題