gpt4 book ai didi

c# - 夏令时更改后的 DateTimeOffset 显示

转载 作者:太空狗 更新时间:2023-10-30 00:56:49 24 4
gpt4 key购买 nike

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

11/6/2010  10:15:00 AM 

如果我运行这段代码:

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

然后我得到这个结果:

Local time: 11/6/2010 10:15:00 AM

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

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

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

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

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

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

我想我不是第一个遇到这个问题的人。其他人如何解决这个问题? (还是我的事实有误?)

最佳答案

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

顺便说一下,您可能希望分别存储一个简单的 UTC 时间和时区标识符。如果您要存储时区,那么使用 DateTimeOffset 将不会对 UTC 日期/时间特别有用。 (另一方面,更清楚的是它确实代表了一个瞬间 - DateTime 是一个非常困惑的类型,它不能让你轻松地表达你正在尝试的东西来表示。)

当然,我个人鼓励您查看 Noda Time在我非常有偏见的观点中,这是一个比内置 API 更清晰的日期/时间 API……但还没有完全准备好用于生产。 (虽然我们正在到达那里......)

关于c# - 夏令时更改后的 DateTimeOffset 显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6769427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com