C# 日光节约时间是否会导致日期时间计算变为负数

C# 日光节约时间是否会导致日期时间计算变为负数,c#,datetime,dst,C#,Datetime,Dst,我们目前正在改写我们服务的核心,基本上我们有计划的任务,可以按时间间隔、日期、特定时间等运行 目前,我们想知道DaylightSave是否会给我们带来麻烦,基本上我们计算下一个可能的运行时,基于任务应该执行的天数、时间间隔和时间间隔。为此,我们采用当前时间,并将天/分钟/小时添加到此日期时间 然后我们用这个新的运行时间减去DateTime。现在从这个DateTime开始,留下时间跨度直到下一次运行 然而,如果当前时间是daylightsavinds日的01:50,我们加上20分钟,这是我们设定的

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

目前,我们想知道DaylightSave是否会给我们带来麻烦,基本上我们计算下一个可能的运行时,基于任务应该执行的天数、时间间隔和时间间隔。为此,我们采用当前时间,并将天/分钟/小时添加到此日期时间

然后我们用这个新的运行时间减去DateTime。现在从这个DateTime开始,留下时间跨度直到下一次运行

然而,如果当前时间是daylightsavinds日的01:50,我们加上20分钟,这是我们设定的时间间隔,最后的时间是02:10,但既然这是daylightsavinds,实际上是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;
}
//获取nextrun和现在之间的间隔!
双间隔=(NextRun-DateTime.Now).total毫秒;
//检查间隔是否曾经小于或等于0,应该永远不会发生,但可能与夏令时?

如果(interval使用DateTime.UtcNow而不是DateTime.Now EVERYWHERE

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

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


如果你想得到实际经过的时间,那么你必须在计算时差之前将时间转换为世界时。此外,如果你使用本地时间,那么当时钟倒转时,你将无法区分不明确的时间。

这不会导致问题吗?当我们想让任务在20:00和05:00之间运行时?因为使用UtcNow时,这会导致让任务不运行一个小时?或者这将如何运行?实际上,更准确地说,我们将计算更改为使用Utc,所有配置都是在本地时间完成的。这些本地时间随后更改为Utc。这是因为我们仍然可以配置计划以运行正确的时间,而不会被daylightsavin卡住g问题。我意识到我来晚了,但为什么不依赖操作系统来为您完成这项工作,比如安排服务/cronjob按您需要的时间间隔运行?这似乎可以让您的程序更简单(即,不处理日期内容,只是假设无论何时启动,都是运行时间)。有没有理由不考虑或不起作用?以下是一些附加链接:[五种常见的.NET开发人员夏令时反模式]()如果您想支持任意时区,那么我认为您需要
DateTimeOffset
来正确处理所有情况。否则,使用
DateTime
,在大多数情况下都可以正确处理时间,尽管指定不明确的时间会有问题(它基本上会作为标准时间处理)。为此,您需要使用
DateTime
成员转换为本地时间…因此,我不推荐这种方法,除非您确定您只需要处理当前时区,并且您已经有很多代码,其中时间存储在UTC时间,但显示为本地时间。