无论用户的本地时区设置为什么,使用C#(.NET 2.0)我都需要确定东部时区中的时间(DateTime对象)。获取另一个时区的日期时间,而不考虑当地时区
我知道这些方法,但似乎没有成为一个明显的方式来获得一个DateTime对象比用户是在什么不同的时区。
DateTime.Now
DateTime.UtcNow
TimeZone.CurrentTimeZone
当然,该解决方案的需求夏令时意识到。
无论用户的本地时区设置为什么,使用C#(.NET 2.0)我都需要确定东部时区中的时间(DateTime对象)。获取另一个时区的日期时间,而不考虑当地时区
我知道这些方法,但似乎没有成为一个明显的方式来获得一个DateTime对象比用户是在什么不同的时区。
DateTime.Now
DateTime.UtcNow
TimeZone.CurrentTimeZone
当然,该解决方案的需求夏令时意识到。
正如其他人所提到的,.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
如何
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
}
什么如果你的位置不使用DST?然后IsDaylightSavingTime将返回false。 – 2009-01-13 22:39:29
UTC不会受到DST的影响;当然,这是我们需要知道的东部DST,而不是当地人。 – 2009-01-13 22:40:00
Got me ...我不知道是否可以为计算机设置的不同时区创建时区对象。而且你不会在东部时间创建一个时区对象,以确定它是否存在DST ... – 2009-01-13 22:44:05
在.NET 3.5中,有TimeZoneInfo
,它提供了很多这方面的功能; 2.0SP1有DateTimeOffset
,但这种限制更多。
获取UtcNow
并添加固定偏移量是作业的一部分,但不是DST感知的。
所以在3.5,我认为你可以这样做:
DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
DateTime.UtcNow, "Eastern Standard Time");
但这根本不存在2.0;抱歉。
从 - 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类中查看here。此类将一些p/invoke内容包装到Win O/S中以从O/S获取时区信息。当2.0是新的并且它工作得非常好时,我成功地使用了它。我工作的网站必须能够向用户显示本地的每个日期/时间,并且必须具有DST意识,并且这个班级为我们填写了账单。
一个日期比较是一个日期比较。 DateTime只是封装了一个以tick为单位定义的内存结构,并使访问内存常用部分的方法成为可能,例如一天或一年的时间或的TimeOfDay等
而且转换是唯一可能的,如果你知道这两个源SND目的地偏移,然后计算总是给出由-1 * (sourceOffset - destOffset)
凡在括号中的部分表示给定时区差异。
另请参阅
请参阅http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay 2014-12-12 01:29:04