首页 文章

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

提问于
浏览
40

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

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

DateTime.Now
 DateTime.UtcNow
 TimeZone.CurrentTimeZone

当然,解决方案需要节省时间 .

6 回答

  • 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);
    

    这是How to get time zone info (DST) from registry?的档案

  • 8

    在.NET 3.5中,有TimeZoneInfo,它在这个领域提供了很多功能; 2.0SP1有DateTimeOffset,但这个更有限 .

    获取 UtcNow 并添加固定偏移量是作业的一部分,但不支持DST .

    所以在3.5我觉得你可以这样做:

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

    但这在2.0中根本不存在;抱歉 .

  • 82

    从 - 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.");
    }
    
  • 6

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

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

  • 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年中,为东部时间的 Spring 季前进和后退日期使用硬编码值的静态字典 . 这只是300字节左右......然后将其编入索引以确定它是否是东海岸的夏令时 . ..正如所指出的,你不关心它是否在当地区域的dST ......

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

    日期比较是日期比较 . DateTime只包含一个以刻度形式定义的存储器结构,并使方法能够访问存储器的常用部分,例如一天或一年或时间或时间天等

    此外,只有当您知道源snd目标偏移并且计算始终如给定的计算由 -1 * (sourceOffset - destOffset) 给出时才能进行转换 .

    括号中的部分表示时区差异 .

    还请看

    Get eastern time in c# without converting local time

相关问题