夏令时更改后显示DateTimeOffset

Vac*_*ano 4 .net c# datetime .net-4.0 datetimeoffset

我有一个关于DateTimeOffset和夏令时的问题.为了解释我的问题,我们假设现在的日期和时间是:

11/6/2010  10:15:00 AM 
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码:

DateTimeOffset myTime = DateTimeOffset.Now;
Console.WriteLine("Local time: " + myTime.ToLocalTime().DateTime);
Run Code Online (Sandbox Code Playgroud)

然后我得到这个结果:

当地时间:11/6/2010 10:15:00 AM

意思是事件发生在早上10:15(我的时区是Mountain Daylight Time(-6 offset)).

所以,然后我将这个DateTimeOffset保存到我的SQL Server 2008 db(作为DateTimeOffset).第二天我想把它显示给用户.但现在夏令时已经到期.

如果我使用保存的关闭值运行上述WriteLine(从前一天)将显示什么?

存储在数据库中的偏移量为-6.但是现在夏令时结束了,目前的偏差是-7.因此,据我了解文档,它将首先将我的时间转换为UTC时间(所以它需要上午10:15并增加6小时(下午4:15).然后它将减去当地时间的当前偏移量(4:15) pm - 7 = 9:15 AM).

因此,如果我的数学是正确的,那么现在当我显示我的事件时,它将显示它发生在上午9:15而不是上午10:15.

这个不好.我想存储时区信息,但我需要时间在同一时区保持静态.(意思是如果事件发生在犹他州的上午10:15,那么下次我看它(在犹他州),我需要看到它是在上午10:15,无论夏令时是否发生了变化.

我不认为我是第一个遇到这个问题的人.别人怎么做才能解决这个问题?(或者我有错误吗?)

Jon*_*eet 6

不,它不会添加当前的偏移量 - 它会在该日期添加偏移量,即 6.所以它应该仍然显示在上午10:15,因为它知道所涉及的日期,因此在该日期生效的时区规则.

顺便说一句,您可能希望单独存储简单的UTC时间和时区标识符.如果您要存储时区,那么使用DateTimeOffset对于UTC日期/时间不会特别有用.(另一方面,更确切地说它确实代表了一个瞬间 - DateTime是一种非常混乱的类型,它不会让你轻易表达你想要表达的东西.)

当然,我个人鼓励你看一下Noda Time,我认为这是一个比内置的更清晰的日期/时间API ...但是还没有为生产使用做好准备.(虽然我们到了那里......)