您何时更喜欢 DateTime 而不是 DateTimeOffset

Posted

技术标签:

【中文标题】您何时更喜欢 DateTime 而不是 DateTimeOffset【英文标题】:When Would You Prefer DateTime Over 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】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

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

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

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

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

【讨论】:

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

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

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

何时更喜欢 XAMPP 而不是 Linux、Apache、MySQL 和 PHP 的完整安装

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

何时更喜欢用 SelectMany() 表示的连接而不是用 Linq 中的 join 关键字表示的连接

何时在 c# 中使用 ArrayList 而不是 array[]?

为啥游戏逻辑更喜欢 update() 而不是 didFinishUpdate?