我使用Noda Time libarary(v 2.0.3)在.net核心项目中进行日期时间处理。然而;我在将即时转换为CET日期时遇到了一些问题。
我对Noda Time相当新,可能使用它错了(CET tz-db条目根本不是指CET)?
示例代码
// get current system instant
var systemInstant = SystemClock.Instance.GetCurrentInstant();
// get oslo zoneddatetime from instant
var osloDateTime = systemInstant.InZone(DateTimeZoneProviders.Tzdb["Europe/Oslo"]);
// get CET(?) zoneddatetime from instant
var cetDateTime = systemInstant.InZone(DateTimeZoneProviders.Tzdb["CET"]);
// output
Debug.WriteLine(osloDateTime.ToString());
Debug.WriteLine(cetDateTime.ToString());
上面示例代码的输出给了我:
2017-06-16T22:28:16 Europe/Oslo (+02)
2017-06-16T22:28:16 CET (+02)
实际上我期望CET的分区时间是21:28:16(UTC + 1)而不是22:28:16(UTC + 2)。 UTC + 1也是Time and date website显示的内容。
答案 0 :(得分:4)
IANA时区数据库中Zone
文件的europe
行包含CET
区域ID的这一行:
Zone CET 1:00 C-Eur CE%sT
然后C-Eur
规则的结束重复是这对行:
Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S
Rule C-Eur 1996 max - Oct lastSun 2:00s 0 -
所以它在每年3月的最后一个星期日凌晨2点进入UTC + 2,并在每年10月的最后一个星期日凌晨2点回到UTC + 1。
请注意"缩写"在CET时区,CET" CET"和" CEST" - 这可能是误导你的。但Noda Time 遵循 ID " CET"的定义。根据IANA数据库。
这是避免使用缩写的另一个原因,而是使用完全区域ID,例如Europe / Oslo,这些都是明确的。我建议避免尝试使用" CET日期时间"完全。
答案 1 :(得分:1)
如果查看DateTimeZoneProviders.Tzdb [“CET”]的结果,它的最小偏移量为+1,最大偏移量为+2,所以我认为它是指实际的中欧时区(包括中欧夏令时[CEST])。
由于您选择的日期属于夏令时间范围,因此为UTC + 2。
如果您尝试以下操作,您将获得CET的UTC + 1:
Instant.FromDateTimeUtc(new DateTime(2017, 01, 01, 12, 0, 0, DateTimeKind.Utc)).InZone(DateTimeZoneProviders.Tzdb["CET"]