野田时间即时到CET

时间:2017-06-16 20:38:07

标签: c# .net-core nodatime

我使用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显示的内容。

2 个答案:

答案 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"]