【问题标题】:UTC - Working one day behindUTC - 落后一天工作
【发布时间】: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 信息,而您不必自己跟踪/管理它。

标签: c# datetime utc


【解决方案1】:

因为用户的一天可能不是在 UTC 时间午夜开始和结束,所以您在数据库中的日期字段也需要包含时间。否则您的澳大利亚报告将包含超过 24 小时的统计数据。如果忽略时间,从 02/08/2010 到 04/08/2010 的日期范围只会看起来很奇怪。如果您包括时间并仔细检查范围,您会发现它确实包含 24 小时,就像预期的那样。当您将其转换回本地时间以显示报告时就可以了。

【讨论】:

  • +1 啊...好点。所以我认为问题在于我怀疑我应该使用日期AND时间而不只是日期来查找数据库中的信息。
  • 这本质上是问题所在。
【解决方案2】:

“在当地时间上午 7 点查询”和“前一天 UTC”之间的不匹配似乎很奇怪恕我直言 - 我想用户会想要前一天的数据,而“天”在他们的当地时间,所以你想要搜索的范围是 DateTime.Today.AddDays(-1) 到 DateTime.Today (所以它涵盖'昨天,本地时间'),并且由于你以 UTC 存储,我们只需添加 ToUniversalTime 到每个都让他们进入 UTC 以查询数据库。

var startOfToday = DateTime.Today.ToUniversalTime();
var startOfYesterday = startOfToday.AddDays(-1);

var query = ...

【讨论】:

  • 但 UTC -1 与 Localtime -1 相同。我认为问题是@Hirvox 指出的。我只使用日期来查询而不是日期和时间。如果我按日期和时间查询,那么我确实会得到正确的 24 范围。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2023-02-11
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多