繁体   English   中英

获取另一个时区的日期时间,无论当地时区

[英]Get DateTime For Another Time Zone Regardless of Local Time Zone

无论用户的本地时区设置为什么,使用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.");
}

我会节省你的时间,告诉你在.net中没有办法,版本2.0为另一个时区提供一个DateTime对象,该时区不同于运行软件的时区(UTC除外)。

但是,这并不意味着没有办法在.net之外做到这一点。 看看这里的TimeZoneInformation类。 此类将一些p / invoke内容包装到Win O / S以从O / S获取时区信息。 当2.0是新的时,我成功地使用了它并且它工作得非常好。 我正在处理的网站必须能够显示用户本地的每个日期/时间,并且必须能够识别DST,并且这个课程为我们填写了账单。

怎么样

 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
   }

日期比较是日期比较。 DateTime只包含一个以ticks定义的内存结构,并使方法可以访问内存的常用部分,例如day或year或Time或TimeOfDay等。

此外,只有当您知道源snd目标偏移并且计算始终为给定的计算由-1 * (sourceOffset - destOffset)给出时-1 * (sourceOffset - destOffset)

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

还请看

在没有转换当地时间的情况下获取c#的东部时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM