获取另一个时区的date时间,而不考虑本地时区

无论用户的本地时区设置为什么,使用C#(.NET 2.0)我都需要确定东部时区的时间(DateTime对象)。

我知道这些方法,但似乎没有一个明显的方式来获取DateTime对象的时区不同于用户所在的时区。

DateTime.Now DateTime.UtcNow TimeZone.CurrentTimeZone 

当然,解决scheme需要夏时制。

正如其他人所提到的,.NET 2不包含任何时区信息。 尽pipe如此,信息存储在registry中,而且在它周围写一个包装类是相当简单的:

SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones

包含所有时区的子键。 TZI字段值包含一个时区的所有转换和偏移属性,但是它全部填入二进制数组中。 最重要的位(偏差和日光),分别存储在位置0和8的int32:

 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

在.NET 3.5中,有TimeZoneInfo ,它提供了很多这方面的function; 2.0SP1有DateTimeOffset ,但是这是有限的。

获得UtcNow并添加一个固定的偏移是工作的一部分,但不是DST意识。

所以在3.5我觉得你可以做一些事情:

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

但是这根本不存在于2.0中; 抱歉。

From – http://msdn.microsoft.com/zh-CN/library/system.timezoneinfo.converttimefromutc.aspx

这样就可以通过名称find时区,以防美国从伦敦经线向西或向东漂浮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类。 这个类将一些p / invoke内容包装到Win O / S中,以从O / S获取时区信息。 当2.0是新的时候,我成功地使用它,它工作得很好。 我正在工作的网站必须能够向用户显示本地的每个date/时间,并且必须是DST意识到的,并且这个class级填写了我们的账单。

怎么样

  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年的回落date..这只有300个字节左右…然后索引,以确定是否是东海岸的夏令时。 ..正如指出的,你不在乎是否dST在本地区或不…

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

date比较是date比较。 date时间只是包装一个内存结构,这是定义在蜱中,并使方法来访问内存的常用部分,如日或年或时间或TimeOfDay等

此外,只有在知道源目标偏移量和计算总是按给定值-1 * (sourceOffset - destOffset)

括号内的部分代表时区差异。

也请看

获取东部时间在C#不转换当地时间