UTC - 落后一天

时间:2010-08-03 10:02:03

标签: c# datetime utc

我有一个记录统计数据的应用程序。当用户提交他们的统计数据时,信息被存储并且日期/时间被记录为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年8月3日收到2010年8月2日的报告,这是正确的。但是,对于澳大利亚(因为他们提前10小时),这意味着他们将在2010年8月4日收到一份报告,该报告将落后2天。

应该发生的事情是,当我的申请在2010年8月3日22:00运行时,它应该为澳大利亚生成 03/08/2010的报告。但是,根据上面的设置,您可以看到为什么没有发生这种情况。

我似乎无法将手指放在这个上面?我觉得这与我忽略时间和仅依靠UTC日期有关,但我不确定。

2 个答案:

答案 0 :(得分:1)

由于用户的日期可能无法在UTC时间午夜开始和结束,因此数据库中的日期字段也需要包含时间。否则,您的澳大利亚报告将包含超过24小时的统计数据。如果您忽略时间,那么从2010年8月2日到2010年8月4日的日期范围看起来很奇怪。如果你包括时间并仔细检查范围,你会发现它确实包含24小时,就像预期的那样。当您将其转换回当地时间以显示报告时,它会没问题。

答案 1 :(得分:0)

“当地时间早上7点查询”与“前一天UTC”之间的不匹配似乎很奇怪哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇所以你想要在其中搜索的范围是DateTime.Today.AddDays(-1)到DateTime.Today(因此它涵盖'昨天,本地时间'),并且由于你以UTC格式存储,我们只需将ToUniversalTime添加到每个将它们转换为UTC以查询数据库。

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

var query = ...