2009-01-13 70 views
38

无论用户的本地时区设置为什么,使用C#(.NET 2.0)我都需要确定东部时区中的时间(DateTime对象)。获取另一个时区的日期时间,而不考虑当地时区

我知道这些方法,但似乎没有成为一个明显的方式来获得一个DateTime对象比用户是在什么不同的时区。

DateTime.Now 
DateTime.UtcNow 
TimeZone.CurrentTimeZone 

当然,该解决方案的需求夏令时意识到。

+0

请参阅http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay 2014-12-12 01:29:04

回答

8

正如其他人所提到的,.NET 2不包含任何时区信息。 的信息存储在注册表中,虽然和其相当琐碎写它周围的包装类:

SOFTWARE \微软\的Windows NT \ CURRENTVERSION \ Time区域

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

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

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 
    } 
+0

什么如果你的位置不使用DST?然后IsDaylightSavingTime将返回false。 – 2009-01-13 22:39:29

+0

UTC不会受到DST的影响;当然,这是我们需要知道的东部DST,而不是当地人。 – 2009-01-13 22:40:00

+0

Got me ...我不知道是否可以为计算机设置的不同时区创建时区对象。而且你不会在东部时间创建一个时区对象,以确定它是否存在DST ... – 2009-01-13 22:44:05

78

在.NET 3.5中,有TimeZoneInfo,它提供了很多这方面的功能; 2.0SP1有DateTimeOffset,但这种限制更多。

获取UtcNow并添加固定偏移量是作业的一部分,但不是DST感知的。

所以在3.5,我认为你可以这样做:

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

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

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."); 
} 
2

我会救你的时候,告诉你,没有在.NET适当,2.0版本没有办法让从该软件上运行的一个不同的另一时区中的DateTime对象(其他比UTC)。

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

0

一个日期比较是一个日期比较。 DateTime只是封装了一个以tick为单位定义的内存结构,并使访问内存常用部分的方法成为可能,例如一天或一年的时间或的TimeOfDay等

而且转换是唯一可能的,如果你知道这两个源SND目的地偏移,然后计算总是给出由-1 * (sourceOffset - destOffset)

凡在括号中的部分表示给定时区差异。

另请参阅

Get eastern time in c# without converting local time

相关问题