【发布时间】:2019-04-08 18:24:40
【问题描述】:
我编写了几个测试来将时间从特定时区转换为 UTC。
规则规定,在欧洲,时钟在 01:00 UTC 前移,对于“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 Standard Time':
...
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("GTB Standard Time");
return timeZone.IsDaylightSavingTime(testDate);
}
这将返回 False,尽管 2019 年 3 月 31 日本地 03:20:00 夏令时应该已经开启。这应该返回 True。
我设法仅在 Windows 上使用 .Net 时区的内置数据库重复此测试。使用 tzdata db(例如 NodaTime)为此测试返回 True。
令人困惑的部分是 我手动为 timeZone 对象抛出了一个错误,以查看 TimeZoneInfo 对象有哪些额外信息,发现 DST 启动实际上是正确的:
timeZone.GetAdjustmentRules().First().DaylightTransitionStart.TimeOfDay
返回时间 03:00:00
有人可以确认这一点,还有没有办法检查 Windows 在哪里花费 DST 时间?我可以在不使用任何外部库的情况下在 windows 和 linux 上都通过当前测试吗?
【问题讨论】:
-
会不会是
new DateTime(2019, 03, 31, 03, 20, 00)根据您的当地时间返回不同的UTC 日期,所以testDate在两种环境中不一样? -
不,因为我自己也在同一个时区。另一个环境是在带有单色图像的 docker 上创建的,我在其中设置了相同的时区。
标签: .net datetime testing timezone dst