你啥时候更喜欢 DateTime 而不是 DateTimeOffset

Posted

技术标签:

【中文标题】你啥时候更喜欢 DateTime 而不是 DateTimeOffset【英文标题】:When Would You Prefer DateTime Over DateTimeOffset你什么时候更喜欢 DateTime 而不是 DateTimeOffset 【发布时间】:2010-09-20 20:19:15 【问题描述】:

几个月前,我被介绍到新的DateTimeOffset 类型,很高兴DateTime 在时区方面的缺陷终于得到了解决。

但是,我想知道使用这种新类型是否会产生任何开销或问题。

我在一个多语言环境的 Web 应用程序上工作。有谁知道有什么东西可以让我不把它用于我所有的日期/时间工作?这里有滥用的窗口吗?

参考:DateTimeOffset: A New DateTime Structure in .NET 3.5 by Justin Van Patten

【问题讨论】:

相关问题 - ***.com/questions/2532729/… 另见this answer 【参考方案1】:

有时您真的只想表示“本地”(不知道时区)日期和时间,而不是 即时。老实说,只代表一个时间更有用 - 例如。 “无论时区如何,早上 8 点叫醒我” - 但日期和时间也可能有用。

我同意,对于绝大多数情况,DateTimeOffset 更合适。确实让我感到奇怪的是,没有一个 DateTimeTimeZone 结构同时具有即时和时区......但偏移量实际上并没有为您提供所需的所有信息。 (例如,给定DateTimeOffset,您不知道 24 小时后的时间,因为您不知道 DST 何时开始。)

如果你想要那种结构,我有一个very crude implementation in another answer。我相信它可以很容易地改进:)

【讨论】:

您可以始终以 UTC 表示您的时间,并在需要时转换为特定时区... Omer:但我发现,您通常还想保留时区信息。是的,通常您可以只使用 UTC 时间,但对于经常性事件等,您也需要知道时区。 本地时间通常只用于未来的日期,您希望它们随着时区的变化而调整。历史数据应始终存储在一致的时区中,可能是 UTC,尽管可能有另一个历史原因。 (例如:对于 NYSE 交易数据,您可能需要全面的 EST)。 @Ben:不过,您正在考虑instants。并非一切都是这样。例如,“我的生日”是每年的 6 月 19 日——过去、现在和未来。或者“2000 年的第一天”,它在每个时区的不同时刻开始。或我闹钟的“早上 6 点”。基本上,确保你知道你真正代表的是什么类型的东西是值得的。【参考方案2】:

嗯,一个明显的答案是当您需要支持没有附带 SP 的客户端时(实际上不在 3.5 中,而是在同时发布的 2.0 SP1 中)。

【讨论】:

没错,但我实际上是在我的代码和 UI 层内部谈论的。 很公平。我想我会提到它,因为当您使用 SP1 功能而据称针对 2.0 时,VS 多目标并不明显。现在至少有一个 FxCop(等)插件可以做到这一点。【参考方案3】:

虽然我不喜欢在 DateTimeOffset 上使用 DateTime,但请注意,有时您需要这样做,因为 MS .Net 不支持 DateTimeOffset 作为 DataColumn.DataType 属性DataColumn.DataType Property,即使 SQL datetimeoffset 自 SQL2008 以来一直存在。

我自己在读取 (ReadXml) 带有 XmlReadMode.InferTypedSchema 的 XML 导出数据集的 DateTimeOffset 值时遇到问题;当我尝试将其合并到 DateTimeOffset 列中时,它会将其读取为 DateTime 并崩溃

【讨论】:

以上是关于你啥时候更喜欢 DateTime 而不是 DateTimeOffset的主要内容,如果未能解决你的问题,请参考以下文章

你啥时候在流中使用接口而不是类型别名?

TypeError:strptime()参数1必须是str,而不是datetime.date Python

DateTime 时间戳有句点而不是冒号

在 Hibernate 中持久化 Joda DateTime 而不是 Java Date

3星|《不会被机器替代的人》:人在被服务的时候,更喜欢面对面跟人打交道,而不是跟机器打交道

何时更喜欢 lambda 而不是带有 std::async 的打包任务? [复制]