【问题标题】:DateTimeOffset display after daylight savings change夏令时更改后的 DateTimeOffset 显示
【发布时间】:2011-10-09 19:28:06
【问题描述】:

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

11/6/2010  10:15:00 AM 

如果我运行这段代码:

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

然后我得到这个结果:

当地时间:2010 年 11 月 6 日上午 10:15:00

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

所以,然后我将此 DateTimeOffset 保存到我的 SQL Server 2008 db(作为 DateTimeOffset)。第二天我想向用户展示它。但是现在夏令时已经过期了。

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

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

所以如果我的数学是正确的,现在当我显示我的事件时,它会显示它发生在上午 9:15 而不是上午 10:15。

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

我想我不是第一个遇到这个问题的人。其他人会做什么来解决这个问题? (还是我的事实有误?)

【问题讨论】:

    标签: c# .net datetime .net-4.0 datetimeoffset


    【解决方案1】:

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

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

    当然,我个人鼓励您查看Noda Time,在我看来,它是一个比内置 API 更清晰的日期/时间 API……但它还没有准备好用于生产用途. (虽然我们已经到了那里......)

    【讨论】:

    • 同意 - 只要您跟踪时区,存储 DateTimeOffset 对象不会给您带来太多好处。只需使用 UTC 并将时区标识符与它一起存储。
    • @Doug 我认为他的意思是他存储偏移量(作为 DateTimeOffset 列的一部分),而不是实际的“时区”。
    猜你喜欢
    • 2012-02-12
    • 2021-09-24
    • 2014-12-30
    • 2022-01-03
    • 2017-03-21
    • 1970-01-01
    • 2017-02-26
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多