在夏令时改变后显示的DateTimeOffset

本文关键字:DateTimeOffset 显示 夏令时 改变 | 更新日期: 2023-09-27 18:03:12

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

11/6/2010  10:15:00 AM 

如果我运行以下代码:

DateTimeOffset myTime = DateTimeOffset.Now;
Console.WriteLine("Local time: " + myTime.ToLocalTime().DateTime);

然后我得到这个结果:

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

表示事件发生在上午10:15(我的时区是山地夏令时(-6偏移))。

所以,然后我保存这个DateTimeOffset到我的SQL Server 2008数据库(作为DateTimeOffset)。第二天我想把它展示给用户。但是现在夏令时已经过期了。

如果我用保存的off值(从前一天开始)运行上面的WriteLine将显示什么?

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

如果我的计算是正确的,现在当我显示我的事件时,它将显示它发生在上午9:15而不是10:15。

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

我不认为我是第一个有这个问题的人。其他人如何解决这个问题?(还是我搞错了?)

在夏令时改变后显示的DateTimeOffset

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

顺便说一下,您可能希望单独存储一个简单的UTC时间和时区标识符。如果您正在存储时区,那么使用DateTimeOffset对于仅使用UTC日期/时间来说并不是特别有用。(另一方面,很明显确实表示时间上的一个瞬间——DateTime是一个非常混乱的类型,它不能让您轻松地表达您想要表示的内容。) 当然,我个人鼓励你看看Noda Time,在我看来,它是一个比内置API更清晰的日期/时间API…但它还没有准备好用于生产。