无论用户的本地时区设置为什么,使用C#(。NET 2.0)我都需要确定东部时区的时间(DateTime对象)。
我知道这些方法,但似乎没有一种明显的方法来获取不同于用户所在时区的DateTime对象。
DateTime.Now
DateTime.UtcNow
TimeZone.CurrentTimeZone
当然,解决方案需要节省时间。
答案 0 :(得分:85)
在.NET 3.5中,有TimeZoneInfo
,它在这个领域提供了很多功能; 2.0SP1有DateTimeOffset
,但这个限制更多。
获取UtcNow
并添加固定偏移量是作业的一部分,但不支持DST。
所以在3.5中我认为你可以做类似的事情:
DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
DateTime.UtcNow, "Eastern Standard Time");
但这在2.0中根本不存在;遗憾。
答案 1 :(得分:8)
正如其他人提到的,.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);
的存档
答案 2 :(得分: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.");
}
答案 3 :(得分:2)
我会节省您的时间并告诉您.net版本2.0中没有办法获得另一个时区的DateTime对象,该时区不同于运行该软件的时区(UTC除外)。
然而,这并不意味着没有办法在.net之外做到这一点。在TimeZoneInformation类中查看here。此类将一些p / invoke内容包装到Win O / S以从O / S获取时区信息。当2.0是新的时,我成功地使用了它并且它工作得非常好。我正在处理的网站必须能够显示用户本地的每个日期/时间,并且必须能够识别DST,并且这个课程为我们填写了账单。
答案 4 :(得分: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
}
答案 5 :(得分:0)
日期比较是日期比较。 DateTime只包含一个以刻度形式定义的存储器结构,并使方法可以访问存储器的常用部分,例如日或年或时间或时间天等等。
此外,只有当您知道源和目的地偏移时才能进行转换,然后由-1 * (sourceOffset - destOffset)
括号中的部分代表时区差异。
请同时参阅