无论用户的本地时区设置为什么,使用C#(.NET 2.0)我都需要确定东部时区的时间(DateTime对象).
我知道这些方法,但似乎没有一种明显的方法来获取不同于用户所在时区的DateTime对象.
DateTime.Now DateTime.UtcNow TimeZone.CurrentTimeZone
当然,解决方案需要节省时间.
在.NET 3.5中,有TimeZoneInfo
一个在这个领域提供了很多功能; 2.0SP1有DateTimeOffset
,但这是有限的.
获取UtcNow
和添加固定偏移量是作业的一部分,但不支持DST.
所以在3.5中我认为你可以这样做:
DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId( DateTime.UtcNow, "Eastern Standard Time");
但这在2.0中根本不存在; 抱歉.
正如其他人提到的,.NET 2不包含任何时区信息.但是,信息存储在注册表中,并且围绕它编写包装类非常简单:
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);
这是如何从注册表获取时区信息(DST)的存档?
来自 - 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."); }