無論用戶的本地時區設置爲什麼,使用C#(.NET 2.0)我都需要確定東部時區中的時間(DateTime對象)。獲取另一個時區的日期時間,而不考慮當地時區
我知道這些方法,但似乎沒有成爲一個明顯的方式來獲得一個DateTime對象比用戶是在什麼不同的時區。
DateTime.Now
DateTime.UtcNow
TimeZone.CurrentTimeZone
當然,該解決方案的需求夏令時意識到。
無論用戶的本地時區設置爲什麼,使用C#(.NET 2.0)我都需要確定東部時區中的時間(DateTime對象)。獲取另一個時區的日期時間,而不考慮當地時區
我知道這些方法,但似乎沒有成爲一個明顯的方式來獲得一個DateTime對象比用戶是在什麼不同的時區。
DateTime.Now
DateTime.UtcNow
TimeZone.CurrentTimeZone
當然,該解決方案的需求夏令時意識到。
正如其他人所提到的,.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
如何
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
}
什麼如果你的位置不使用DST?然後IsDaylightSavingTime將返回false。 – 2009-01-13 22:39:29
UTC不會受到DST的影響;當然,這是我們需要知道的東部DST,而不是當地人。 – 2009-01-13 22:40:00
Got me ...我不知道是否可以爲計算機設置的不同時區創建時區對象。而且你不會在東部時間創建一個時區對象,以確定它是否存在DST ... – 2009-01-13 22:44:05
在.NET 3.5中,有TimeZoneInfo
,它提供了很多這方面的功能; 2.0SP1有DateTimeOffset
,但這種限制更多。
獲取UtcNow
並添加固定偏移量是作業的一部分,但不是DST感知的。
所以在3.5,我認爲你可以這樣做:
DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
DateTime.UtcNow, "Eastern Standard Time");
但這根本不存在2.0;抱歉。
從 - 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.");
}
我會救你的時候,告訴你,沒有在.NET適當,2.0版本沒有辦法讓從該軟件上運行的一個不同的另一時區中的DateTime對象(其他比UTC)。
但是,這並不意味着沒有辦法在.net之外做到這一點。在TimeZoneInformation類中查看here。此類將一些p/invoke內容包裝到Win O/S中以從O/S獲取時區信息。當2.0是新的並且它工作得非常好時,我成功地使用了它。我工作的網站必須能夠向用戶顯示本地的每個日期/時間,並且必須具有DST意識,並且這個班級爲我們填寫了賬單。
一個日期比較是一個日期比較。 DateTime只是封裝了一個以tick爲單位定義的內存結構,並使訪問內存常用部分的方法成爲可能,例如一天或一年的時間或的TimeOfDay等
而且轉換是唯一可能的,如果你知道這兩個源SND目的地偏移,然後計算總是給出由-1 * (sourceOffset - destOffset)
凡在括號中的部分表示給定時區差異。
另請參閱
請參閱http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay 2014-12-12 01:29:04