C# Quartz.NET-x27;这个单元测试通过了吗?

C# Quartz.NET-x27;这个单元测试通过了吗?,c#,unit-testing,timezone,quartz.net,dst,C#,Unit Testing,Timezone,Quartz.net,Dst,这个问题与相关,但更一般,可以独立处理 编辑:Quartz版本是v2.0.1 根据我的理解,以下单元测试应该通过: [测试] 公开无效测试(){ //每月第一天14:00运行 CronExpression=新的CronExpression(“0 0 14 1*?”); //TimeZoneInfo.Local={(UTC+01:00)阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳} 如果(!TimeZoneInfo.Local.SupportsDaylightSavingTime){ 返回;

这个问题与相关,但更一般,可以独立处理

编辑:Quartz版本是v2.0.1

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

[测试]
公开无效测试(){
//每月第一天14:00运行
CronExpression=新的CronExpression(“0 0 14 1*?”);
//TimeZoneInfo.Local={(UTC+01:00)阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳}
如果(!TimeZoneInfo.Local.SupportsDaylightSavingTime){
返回;
}
//获取当前时区的“夏季”时段
var DaylightChanges=时区.CurrentTimeZone.GetDaylightChanges(2013年);
//->daylightChange.Start{31.03.2013 02:00:00}System.DateTime
//->daylightChange.End{27.10.2013 03:00:00}System.DateTime
//在夏季开始之前和之后各获得一个起点
DateTimeOffset BeforeSumertime=daylightChange.Start.ToUniversalTime().AddDays(-1);
DateTimeOffset afterSummertime=daylightChange.Start.ToUniversalTime().AddDays(1);
//->在夏季之前{30.03.2013 01:00:00+00:00}System.DateTimeOffset
//->Summertime{01.04.2013 01:00:00+00:00}System.DateTimeOffset
DateTimeOffset?nextValidTimeFromBefore=表达式.GetNextValidTimeAfter(BeforeSumertime);
DateTimeOffset?nextValidTimeFromAfter=表达式。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,nextValidTimeFromBefore);
}  
但是(如您所见,
nextValidTimeFromBefore
nextValidTimeFromBefore
不同。
nextvalidtimefromfafter
中的结果是正确的。UTC 12:00将导致夏季的14:00(此时已经开始)。 如果
GetNextValidTimeAfter()
参数指定的时间在夏季时间段之内还是之外,这应该无关紧要


下一个有效时间应该相等还是我的方法有缺陷?

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

我在网站上查看了更改日志,其中没有提到相关的修复。彼得·里奇(Peter Ritchie)的评论鼓励我再看看更新的石英版本。当我查看存储库中的提交时,我注意到实际上有一个解决方案

它已在第665版中修复:

合并拉取请求#72来自惊人的andrew/master
CronExpression、日历、CalendarIntervalTriggerImpl的时区问题

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

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


这对我来说很好(我不在你的TZ中),如果我只是创建一个新的
DaylightTime
对象,其中包含你详细描述的开始和结束日期(例如
daylightChange=new DaylightTime(新日期时间(2013,3,31,2,0,0),新日期时间(2013,10,27,2,0,0),TimeSpan.MinValue)
),它也会通过。谢谢,这鼓励我再看看更新的石英版本。我已经检查了网站上的更改日志,其中没有提到相关的修复。然而,当我查看存储库中的提交时,我注意到实际上有一个解决方案。我将添加一个带有详细信息的答案。我用2.1.2.400,FWIW尝试了这个
...
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));
...