为什么方法IsDaylightSavingTime((在特定小时范围内返回一个明显错误的值?为了明确起见,我从UTC日期开始。时间new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc)
是 WEST 夏令时的最后一分钟。事实上,在 WEST 中,它给出了 2 小时的偏移量(2.59 am(,而一分钟后有 1 小时的偏移量(2.00 am(。但是为什么:
TimeZoneInfo.ConvertTimeFromUtc(
new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc),
TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")
).IsDaylightSavingTime()
返回假?!
此方法从 new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc)
开始返回 false(但为什么?(,前面的第二个,new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc)
,它返回 true。
TimeZoneInfo 方法似乎有效:
var thisIsTrue = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time").IsDaylightSavingTime(new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc));
var thisIsFalse = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")).IsDaylightSavingTime();
ConvertTimeFromUtc
方法返回一个 DateTime
类型,该类型与使用 TimeZoneInfo
类型具有不同的IsDaylightSavingTime
方法实现。
- 日期时间是夏令时(( 方法
- 时区信息是夏令时(( 方法
请尝试以下代码...
var date = new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc);
var foo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time").IsDaylightSavingTime(date);
2016 年,欧洲夏令时于 10 月 30 日结束。因此,据我所知,IsDaylightSavingTime(( 返回 false 是完全正确的。2015 年夏令时于 10 月 25 日结束,如果您填写该日期和 10 月 24 日 23:59,您将获得相同的结果。
关于时间。
使用 TimeZoneInfo.ConvertTimeFromUtc
将返回一个 DateTime (10/30/2016 02:59:59(,其中 DateTimeKind Unspecified
这意味着它将调用 TimeZoneInfo.Local.IsDaylightSavingTime
并返回 False。将 UTC 日期时间传递给TimeZoneInfo.Local.IsDaylightSavingTime
如下所示:
TimeZoneInfo.Local.IsDaylightSavingTime(new DateTime(2016, 10, 30, 0, 59, 59, DateTimeKind.Utc));
将导致进行不同类型的计算,即:
Boolean isDaylightSavings;
GetUtcOffsetFromUtc(dateTime, this, out isDaylightSavings);
return isDaylightSavings;
我的猜测是,由于隐式转换与显式转换,计算存在一些差异。DateTime对这些事情有点烦人,这就是为什么这些天我更倾向于Noda时间的原因。
>Casey-obrien在他的评论中是正确的。原因是一旦转换为我的本地时区,凌晨 2:00 到凌晨 2:59 之间的所有时间都变得模棱两可,因为它们出现了两次:一次在 DST 结束之前,一次在之后。这就是该方法返回 false 的原因。
凯西,如果你写你的评论作为答案,我会接受的。谢谢。
如果 TimeZoneInfo 对象表示的时区不支持夏令时,则该方法始终返回 false。包括 Utc 在内的许多时区不遵守夏令时。若要确定时区是否支持夏令时,请检索其"支持夏令时"属性的值。
检查这个