【发布时间】:2013-03-18 22:14:17
【问题描述】:
这个问题与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 与 nextValidTimeFromAfter 不同。 nextValidTimeFromAfter 中的结果是正确的。 UTC 12:00 将导致夏令时 14:00(此时已经开始)。
GetNextValidTimeAfter() 参数指定的时间是在夏季时间段之内还是之外都无关紧要。
NextValidTimes 应该相等还是我的方法有缺陷?
【问题讨论】:
-
这对我来说很好(我不在你的 TZ 中),如果我只是创建一个新的
DaylightTime对象,其中包含你详细说明的开始和结束日期(例如daylightChange = new DaylightTime(new DateTime(2013, 3, 31, 2, 0, 0), new DateTime(2013, 10, 27, 2, 0, 0), TimeSpan.MinValue))它也通过了。 -
谢谢,这鼓励我再看一下较新的 Quartz 版本。我已经检查了网站上的更改日志,其中没有提到相关的修复。但是,当我查看存储库中的提交时,我注意到实际上有一个解决方法。我将添加一个包含详细信息的答案。
-
我用 2.1.2.400, FWIW 试过这个
标签: c# unit-testing timezone quartz.net dst