【问题标题】:Does Daylightsaving time cause DateTime calculations to become negative夏令时是否会导致 DateTime 计算变为负数
【发布时间】:2016-10-31 22:09:16
【问题描述】:

我们目前正在重写我们服务的核心,基本上我们有可以按时间间隔、日期、特定时间等运行的计划任务。

目前我们想知道夏令时是否会给我们带来麻烦,基本上我们根据任务应该执行的日期以及时间间隔和间隔来计算下一个可能的运行时间。我们通过获取当前时间并将天/分钟/小时添加到此 DateTime 来做到这一点。

然后我们获取这个新的运行时间并从这个 DateTime 中减去 DateTime.Now,留下到下一次运行之前的时间跨度。

但是,如果当前时间是夏令时的 01:50,我们会增加 20 分钟,这是我们设定的时间间隔,最后的时间是 02:10,但是既然是夏令时,它就是实际上是 01:10。

当我从 01:10(实际上是 02:10)中减去当前时间 (01:50) 时,这会返回一个负值,我需要解决这个问题,还是因为 DateTime 永远不会返回负值是否只是一个很长的底层保存了正确的信息?

基本上,下面的代码,是否需要检查?

//Get interval between nextrun and right now!
double interval = (NextRun - DateTime.Now).TotalMilliseconds;

//Check if interval is ever less or equal to 0, should never happen but maybe with daylight saving time?
if(interval <= 0)
{
    //Set default value
    interval = IntervalInMilliseconds;
}

我们认为不需要这项检查,但到目前为止,我们的谷歌搜索还没有给我们一个明确的答案。

【问题讨论】:

  • 我意识到我迟到了,但为什么不依赖操作系统为您执行此操作,例如安排服务/cronjob 以您需要的时间间隔运行?似乎它可以让你的程序更简单(即不处理日期的东西,只是假设每当它启动时,就该运行了)。是否有理由不考虑或不起作用?

标签: c# datetime dst


【解决方案1】:

在任何地方都使用 DateTime.UtcNow 而不是 DateTime.Now

【讨论】:

  • 这不会引起问题吗?当我们希望任务在 20:00 到 05:00 之间运行时?因为它在使用 UtcNow 时会使任务不会运行一个小时,它应该吗?或者这会如何表现?
  • 实际上,更准确地说,我们将计算更改为使用 Utc,但所有配置都是在本地时间完成的。这些本地时间然后更改为 Utc。这是我们仍然可以配置我们的时间表以运行正确的时间而不会遇到夏令时问题。
【解决方案2】:

首先,您可以自己尝试一下,因为它会帮助您了解它的工作原理。

基本上,使用上面的示例,如果您距离当地时间有 20 分钟,那么它将是 2:10 而不是 1:10,因为计算是在当地时间完成的。如果要得到 1:10,则需要将当地时间转换为世界时间,加上 20 分钟,然后再转换回本地时间。

如果您想要真正的经过时间,那么您必须在计算时差之前将时间转换为通用时间。此外,如果您在当地时间工作,您将无法区分时钟回退时的模糊时间。

【讨论】:

  • 以下是一些附加链接:[.NET 开发人员的五种常见夏令时反模式] (codeofmatt.com/2015/03/06/…)
  • 如果你想支持任意时区,那么我认为你需要DateTimeOffset来正确处理所有情况。否则,使用DateTime,在大多数情况下都可以正确处理时间,尽管指定一个不明确的时间是有问题的(它本质上将作为标准时间处理)。为此,您需要使用DateTime 成员转换为本地时间... 因此,除非确定您只需要处理当前时区并且您已经有很多代码,否则我不能推荐这种方法时间以 UTC 时间存储,但显示为本地时间。
猜你喜欢
  • 2013-01-20
  • 2013-11-24
  • 1970-01-01
  • 2010-10-23
  • 2012-03-20
  • 2015-02-06
  • 2017-07-11
  • 2016-08-02
  • 2018-06-15
相关资源
最近更新 更多