.net 对于';GTB标准时间';在窗户上

.net 对于';GTB标准时间';在窗户上,.net,datetime,testing,timezone,dst,.net,Datetime,Testing,Timezone,Dst,我编写了几个将时间从特定时区转换为UTC的测试 规则规定,在欧洲,时钟在UTC 01:00时向前移动,对于“GTB标准时间”,这意味着+2 UTC,例如03:00:00 然而,我发现在使用TimeZoneInfo.IsDaylightSavingTime(dateTime)方法对不同平台(Linux和Windows)进行测试时存在差异 我为DST转换日期和时间创建了一个新的测试对象: var testDate = new DateTime(2019, 03, 31, 03, 20, 00); /

我编写了几个将时间从特定时区转换为UTC的测试

规则规定,在欧洲,时钟在UTC 01:00时向前移动,对于“GTB标准时间”,这意味着+2 UTC,例如03:00:00

然而,我发现在使用TimeZoneInfo.IsDaylightSavingTime(dateTime)方法对不同平台(Linux和Windows)进行测试时存在差异

我为DST转换日期和时间创建了一个新的测试对象:

var testDate = new DateTime(2019, 03, 31, 03, 20, 00); //20 minutes after Daylight Saving Time start
...
并将其传递给TimeZoneInfo“timeZone”对象,其中时区设置为“GTB标准时间”:

...
    var timeZone = TimeZoneInfo.FindSystemTimeZoneById("GTB Standard Time");
    return timeZone.IsDaylightSavingTime(testDate);
}
这将返回False,但2019-03-31当地时间03:20:00夏令时应已启用。这应该是真的

我设法只在Windows上使用内置的.Net时区数据库重复这个测试。With tzdata db(例如NodaTime)对此测试返回True

令人困惑的是 我手动为timeZone对象抛出了一个错误,以查看TimeZoneInfo对象提供了哪些额外信息,并发现DST启动实际上是正确的:

timeZone.GetAdjustmentRules().First().DaylightTransitionStart.TimeOfDay
返回03:00:00


有人能证实这一点吗?有没有办法检查windows在哪里使用DST时间?我可以在不使用任何外部库的情况下在windows和linux上通过当前测试吗?

该时区的本地时间在该特定日期从02:59:59到04:00:00,因此3:20:00无效。它属于前向过渡所造成的缺口

Per(强调矿山)

如果dateTime参数指定的时间无效,则如果dateTime参数的Kind属性的值为DateTimeKind.Local,则方法调用将引发ArgumentException否则,该方法返回false。

如果可以,请使用
DateTimeOffset
类型,或者将
DateTime
DateTimeKind.Utc
一起使用。无论哪种情况,都不可能出现无效或不明确的当地时间

如果不能这样做,则在
TimeZoneInfo
对象上使用
IsInvalidTime
IsAmbigUstime
测试输入值,然后您可以在代码中决定如何处理结果。例如,对于该实例,您可能希望将3:20移动到4:20

如果时间不明确,请注意
TimeZoneInfo
IsDaylightSavingTime
GetUtcOffset
,等等)上的所有方法都默认采用标准时间,按顺序排在第二位。在这些场景中,人们几乎总是想要白天。通过调用
getAmbiguustimeOffsets
并选择较大的偏移量,可以获得两个可用偏移量


另外,你提到了野田佳彦——一个更好的API,IMHO。在那里,这样的事情是由“解析器”处理的。如果调用
LocalDateTime.inzonelenely
,则使用默认的“宽松”解析器。还有其他解析器,您可以指定自己的解析器。请参阅开始的文档。

是否
新的日期时间(2019、03、31、03、20、00)
根据您的本地时间返回不同的UTC日期,因此
testDate
在这两种环境中不相同?不,因为我自己在同一时区。另一个环境是使用mono image在docker上创建的,我在其中设置了相同的时区。