【问题标题】:Which C# datatype should be used to store dates without time?应该使用哪种 C# 数据类型来存储没有时间的日期?
【发布时间】:2015-09-02 14:03:39
【问题描述】:

PostgreSQL 中有一种用于存储没有时间的日期的数据类型。在 C# 中存储没有时间的日期的最佳数据类型是什么?

我们知道,DateTime 可以与 00:00:00 时间一起使用,但这对外部用户来说非常具有误导性,而且日期也没有时区,但 DateTime 有。 NodaTime 不能在我们的项目中使用,所以我们正在寻找原生的.NET 解决方案。

【问题讨论】:

  • 您的“外部用户”将如何阅读日期?我会说立即使用 ISO 8601 格式。所以在内部使用 DateTime,并将它们打印为YYYY-MM-DD
  • @CodeCaster 这不仅仅是显示问题。例如,比较日期应该强制您将所有内容转换为相同的时区。这是与旅行相关的应用程序中的真正痛苦。同样,比较时间不应强迫您使用任意日期作为基准。
  • @PanagiotisKanavos 我非常了解 BCL 的 DateTime 结构的时区和时间问题,但我没有看到 OP 谈论时区。虽然现在或将来有很多软件需要处理时区,但如果 OP 的日期都在同一个时区并且总是如此,那么使用时间部分为“00:00”的 DateTime 不会伤害任何人。 OP 遇到的唯一问题是显示/导出部分,对此我提出了一个带有问题的解决方案 - OP 没有回答。
  • @CodeCaster OP 确实提到了时区,它们确实会影响转换和比较 - 除非 所有 日期都是 UTC,即使是从输入参数中检索到的日期也是如此在 MVC 操作中或从 SQL Server 中的date 字段中检索时,当您比较具有不同 DateTimeKind 的值时,将会出现意外的时区转换。
  • @PanagiotisKanavos 我提到了“没有时区”,即所有日期都在同一个时区。当然有警告,但考虑到限制,您似乎正在解决一个非问题,System.DateTime 在这里很好。在比较不同类型的 DateTime 时,您 don't need to convert them。是的,使用 DateTime 有其注意事项,但它并不像您声称的那样无法使用。如果所有 OP 想要输出一个日期,DateTime.ToString("YYYY-MM-DD") 可以是一个可行的解决方案。

标签: c# .net postgresql


【解决方案1】:

DateTime 没有时区信息,只有一个通用的 UTC/“本地”指示符。

当时.NET 中没有仅限日期或时间的类型。虽然缺少Date 是一个不便,但缺少TimeOfDay 是一个更大的问题。尽管在 CoreFX Lab 存储库中,人们正在尝试使用 Date 和 TimeOfDay 类型。

目前您必须使用DateTime 类或创建您自己的Date 类。甚至 SQL Server ADO.NET 提供程序也不提供仅日期或时间的类。

当然,您可以随时从 CoreFX 实验室“借用”MIT 许可的 experimental Date implementation

注意

我理解在开发航空旅行相关软件时的痛苦和需求。当我只想与日期进行比较时,不得不使用时区真的很烦人。事情开始真正 ---- 虽然当我需要在 Json 和 DateTime 之间转换以传递仅日期值时。

【讨论】:

  • 由于我不了解CoreFX Lab,我感谢您的详细解释(+1)。
【解决方案2】:

.NET 中没有任何数据类型可以满足您的需求。

只有 DateTime 结构保存了日期和时间的值。

此外,我看不出你为什么不使用DateTime 并且只向用户显示日期。

【讨论】:

  • 微软的 SQL Server 实现也做到了这一点:msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx
  • 使用 DateTime 不是对于仅日期或时间值的最佳选择。例如,旅行日期应该必须转换为 UTC 才能进行比较。在很多情况下,为了比较两个日期而必须执行时区转换
  • @PanagiotisKanavos 当然可以,但我只是想指出,这是 .NET 中的情况,除非您使用像 NodaTime 这样的库,比较(通常)要容易得多.就个人而言,我不得不面对将一个 DateTime 转换为另一个 TimeZone 中的另一个 DateTime 的问题。天哪,我知道 DateTime 是 UTC 格式,使用 NodaTime 时事情变得容易了一些。当我从数据库中读取 DateTime 时,它​​的 Kind 是未指定的,我必须首先创建一个 DateTime 与 UTC 指定的 Kind...在我继续其余部分之前。
  • @PanagiotisKanavos 一般来说,DateTime 有点难以操作,因为它们是在 .NET 中设计的。幸运的是,NodaTime 解决了这个问题。 Ευχαριστώ(谢谢)您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2011-06-06
  • 2011-05-27
相关资源
最近更新 更多