【发布时间】:2010-08-03 10:02:02
【问题描述】:
我有一个记录统计数据的应用程序。当用户提交他们的统计信息时,信息将被存储,并且日期/时间被记录为 UTC,例如
在英国,如果我在 03/08/2010 10:30 记录数字,我记录的日期/时间将是 03/08/2010 09:30,因为我们目前正在观察夏令时。
如果我在澳大利亚,并且我在本地同时记录了我的统计数据,那么我记录的日期/时间将是 02/08/2010 23:30,因为我认为它们提前了大约 10 小时。
我的应用程序需要在每天早上 7 点(当地时间)为每个人生成一份统计报告。因此,当它运行时,它会执行以下操作:
var currentUtc = DateTime.UtcNow.AddDays(-1); // UTC date/time 24 hours from current
然后使用此日期(时间被忽略)从数据库中提取统计信息。现在这对英国来说效果很好。我发现问题的是其他国际国家。更具体地说是澳大利亚。
我遇到的问题是澳大利亚提前 10 小时,因此我的应用程序被触发在英国时间03/08/2010 22:00 左右运行,以生成04/08/2010 07:00 澳大利亚时间的报告。所以发生的事情是这样的:
// the date/time at this point would be 03/08/2010 22:00 (UTC 03/08/2010 21:00)
var currentUtc = DateTime.UtcNow.AddDays(-1);
// so currentUtc is set to 02/08/2010 22:00 (which makes sense for UK, but not for Aussie)
如果以上是针对英国某人的报告,则表示他们将在 2010 年 3 月 8 日收到 2010 年 2 月 8 日的报告,这是正确的。然而,对于澳大利亚(因为他们提前 10 小时),这意味着他们将在 2010 年 4 月 8 日收到 2010 年 2 月 8 日的报告,这将晚 2 天。
应该发生的是,当我的应用程序在 2010 年 3 月 8 日 22:00 运行时,它应该为澳大利亚生成一份报告,该报告是for 03/08/2010。但是,根据上面的设置,您可以看到为什么没有发生这种情况。
我似乎不能把手指放在这个上?我觉得这与我忽略时间而只依赖 UTC 日期有关,但我不确定。
【问题讨论】:
-
@Oded:您的链接有帮助,但它并不能帮助我特别解决我的问题....我已经发布了以前关于 UTC 的问题,所以我了解 最佳实践 我在这个特殊情况下需要帮助。
-
与您的具体问题无关,但总的来说,我发现切换到 DateTimeOffset (以及 sql server 中的 datetimeoffset 列类型)会使这样的 WRT 问题变得更容易,因为这些值会伴随着它们TZ 信息,而您不必自己跟踪/管理它。