gpt4 book ai didi

c# - Quartz.NET - 这个单元测试不应该通过吗?

转载 作者:太空狗 更新时间:2023-10-29 22:52:18 25 4
gpt4 key购买 nike

这个问题与this one有关, 但保持更一般,可以独立处理。

编辑:Quartz 版本是 v2.0.1

根据我的理解,以下单元测试应该通过:

[Test]
public void Test() {
// run every first day of month at 14:00 hours
CronExpression expression = new CronExpression("0 0 14 1 * ?");

// TimeZoneInfo.Local = {(UTC+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien}
if (!TimeZoneInfo.Local.SupportsDaylightSavingTime) {
return;
}

// get "summertime" period for current timezone
var daylightChange = TimeZone.CurrentTimeZone.GetDaylightChanges(2013);
// -> daylightChange.Start {31.03.2013 02:00:00} System.DateTime
// -> daylightChange.End {27.10.2013 03:00:00} System.DateTime

// get one startpoint before and one after begin of summertime
DateTimeOffset beforeSummertime = daylightChange.Start.ToUniversalTime().AddDays(-1);
DateTimeOffset afterSummertime = daylightChange.Start.ToUniversalTime().AddDays(1);
// -> beforeSummertime {30.03.2013 01:00:00 +00:00} System.DateTimeOffset
// -> afterSummertime {01.04.2013 01:00:00 +00:00} System.DateTimeOffset

DateTimeOffset? nextValidTimeFromBefore = expression.GetNextValidTimeAfter(beforeSummertime);
DateTimeOffset? nextValidTimeFromAfter = expression.GetNextValidTimeAfter(afterSummertime);
// nextValidTimeFromBefore {01.04.2013 13:00:00 +00:00} System.DateTimeOffset?
// nextValidTimeFromAfter {01.04.2013 12:00:00 +00:00} System.DateTimeOffset?

Assert.AreEqual(nextValidTimeFromBefore, nextValidTimeFromAfter);
}

但是(如您所见),nextValidTimeFromBefore 不同于 nextValidTimeFromAfternextValidTimeFromAfter 中的结果是正确的。 UTC 12:00 将导致夏季的 14:00(从那时开始)。GetNextValidTimeAfter() 参数指定的时间是在夏令时之内还是之外都无关紧要。

NextValidTimes 应该相等还是我的方法有缺陷?

最佳答案

我发现这实际上是 Quartz.NET 2.0.1 中的一个错误,但它已经在 2.1.0 中得到修复。

我检查了网站上的更改日志,其中没有提到相关的修复。 Peter Ritchie 的评论鼓励我重新审视较新的 Quartz 版本。当我查看存储库中的提交时,我注意到实际上有一个修复程序。

它已在修订版 665 中修复:

Merge pull request #72 from amazing-andrew/master
Time zone issues with CronExpression, calendars, CalendarIntervalTriggerImpl

包含此修复的第一个官方版本是 v2.1.0,它被标记为修订版 685。

错误位于 CronExpression.GetTimeAfter()(由 CronExpression.GetNextValidTimeAfter() 调用):

...
d = new DateTimeOffset(year, d.Month, d.Day, d.Hour, d.Minute, d.Second, d.Offset);

// apply the proper offset for this date (this wasn't there)
d = new DateTimeOffset(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, this.TimeZone.GetUtcOffset(d.DateTime));
...

关于c# - Quartz.NET - 这个单元测试不应该通过吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com