我正在设计一个包含简单“tickler file”的应用程序:
这意味着忽略所有与时区相关的并发症。应用程序的行为就像只有一个时区一样,因此通过更改时区可能会引入意外行为。这是设计的:我试图模拟物理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属性返回的日期误解为日期和时间非常重要。
但我究竟应该如何确保我没有误解日期呢?
答案 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
现在您的应用程序已包含所有这些日期(没有时间和时区信息),您可以考虑处理时区(正如您已经做过的那样)