DateTime是否适合仅存储日期?

时间:2015-01-26 03:00:39

标签: c# date datetime

我正在设计一个包含简单“tickler file”的应用程序:

  • 用户可以为自己创建笔记,每个笔记都有一个附加日期。
  • 用户可以要求应用程序“检查tickler文件” - 这会列出所有已保存的注释,其日期与今天或更早的日期相符。
  • 为了确定“今天”,应用程序只是相信操作系统声称的当前日期。

这意味着忽略所有与时区相关的并发症。应用程序的行为就像只有一个时区一样,因此通过更改时区可能会引入意外行为。这是设计的:我试图模拟物理tickler文件,这将有同样的问题。

我对用于存储日期信息的数据类型感到困惑。我应该使用DateTime,还是自己制作struct Date { public Day; public Month; public Year; }

我知道using the DateTime.Date property。但是,DateTime在内部将数据存储为ticks since midnight 1/1 on 1 AD。这意味着无法在DateTime中实际存储日期,因为每个日期都存储为该日期的瞬间。当我们开始谈论时刻时,似乎我们现在必须处理与时区相关的并发症。

例如,假设2016年1月1日晚上11点在伦敦的一位用户创建了一张应该在2016年1月7日恢复的笔记。然后该用户前往阿拉斯加(他的计算机自动从UTC切换到AKST),并于2016年1月6日当地时间晚上10点列出为“今天”保存的备注。从技术上讲,它现在是2016年1月7日在音符的原始时区,因此任务应该出现。但是在用户的时区只有1月6日,所以不应该出现。

MSDN似乎echo my concern

  

由于DateTime类型表示单个类型中的日期和时间,因此避免将Date属性返回的日期误解为日期和时间非常重要。

但我究竟应该如何确保我没有误解日期呢?

2 个答案:

答案 0 :(得分:1)

是的,在DateTime-stuructures中存储日期是合适的。您需要考虑的是日期的存储与日期的演示文稿之间的分离。您应该使用UTC来存储日期(使用 DateTime.UtcNow 而不是 DateTime.Now ),这样,由于UTC保持跟踪,因此时区永远不会出现问题其他时区的偏移量。为用户显示日期时,可以使用与时区相关的数据并显示该时区的正确日期。您可以在显示日期时使用 DateTime.ToLocalTime 方法。

答案 1 :(得分:0)

您似乎混淆了时区的影响以及在struct DateTime中使用TimeOfDay的效果。

DateTime非常适合存储日期,只要您存储日期时使用DateTime.Date,从而将HH:mm:ss设置为00:00:00。 (这浪费了几个字母的记忆,这在现代应用中几乎无关紧要):

DateTime ticklerDate = DateTime.Now.Date; // 00:00h

现在您的应用程序已包含所有这些日期(没有时间和时区信息),您可以考虑处理时区(正如您已经做过的那样)