【发布时间】:2016-07-29 12:52:52
【问题描述】:
几周前,也就是 2016 年 3 月 27 日,英国的时钟提前了一小时。在 01:00,时钟“跳”到 02:00
http://www.timeanddate.com/time/dst/events.html
这意味着“2016 年 3 月 27 日,01:30”是无效的日期时间,即它不代表实际“发生”的时间。
最近,当 Java 日期时间解析器无法理解我们传递给它的时间时,我们发现了这一点。但是,C# DateTime 似乎根本没有任何问题。
DateTime dt = DateTime.Parse("2016-03-27 01:30:00");
bool invalid = TimeZoneInfo.Local.IsInvalidTime(dt);
虽然invalid 已正确设置为true,但DateTime 存储它似乎没有任何问题。
另外,声明如下:
diff = new DateTime(2016, 3, 27, 2, 30, 0) - new DateTime(2016, 3, 27, 0, 30, 0);
导致 TimeSpan 代表 2 小时,这是不正确的。
为什么 DateTime 类型不考虑夏令时?
【问题讨论】:
-
作为一个英国人,我实际上并没有考虑过这一点,但由于世界各地的时区在不同日期进行夏令时更改,如果它知道的话,我几乎会感到惊讶.. 我希望它只看是有效的日期/时间,例如 00:00 和 23:59:59 之间的有效日期..
-
NodaTime 可能会为您解决此问题。但是,它有不同的 api。
-
NodaTime 等其他 API 存在是有原因的,原因是内置类型严重不足。已经固定了一些解决此问题的支持,但还不够好。如果您需要处理时区,请使用其他内容。