IsDaylightSavingTime 奇怪的行为
IsDaylightSavingTime strange behaviour
为什么 IsDaylightSavingTime() returns 方法在特定时间范围内的值明显错误?明确地说,我从 UTC 日期开始。时间 new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc)
是 WEST 夏令时的最后一分钟。事实上,在西部,它给出了 2 小时的偏移(凌晨 2.59),而一分钟后有 1 小时的偏移(凌晨 2.00)。但是为什么:
TimeZoneInfo.ConvertTimeFromUtc(
new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc),
TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")
).IsDaylightSavingTime()
returns 假的?!
这个方法returns false 从new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc)
开始(但是为什么呢?),第二个之前,new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc)
,它returns 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();
2016 年欧洲夏令时于 10 月 30 日结束。据我所知,IsDaylightSavingTime() returning false 是完全正确的。 2015 年夏令时在 10 月 25 日结束,如果您填写该日期和 10 月 24 日 23:59,您将得到相同的结果。
关于时间。
TimeZoneInfo.ConvertTimeFromUtc
的使用将 return 一个 DateTime (10/30/2016 02:59:59),其中 DateTimeKind 是 Unspecified
,这意味着它将调用 TimeZoneInfo.Local.IsDaylightSavingTime
和 return 错误。
像这样将 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 time。
ConvertTimeFromUtc
方法 returns 一种 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);
Casey-obrien 在他的评论中是正确的。原因是一旦翻译成我当地的时区,凌晨 2.00 点到凌晨 2.59 点之间的所有时间都变得模棱两可,因为它们出现了两次:一次在夏令时结束之前,一次在夏令时结束之后。这就是方法 returns false.
的原因
凯西,如果你把你的评论写成答案我会接受的。谢谢你。
为什么 IsDaylightSavingTime() returns 方法在特定时间范围内的值明显错误?明确地说,我从 UTC 日期开始。时间 new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc)
是 WEST 夏令时的最后一分钟。事实上,在西部,它给出了 2 小时的偏移(凌晨 2.59),而一分钟后有 1 小时的偏移(凌晨 2.00)。但是为什么:
TimeZoneInfo.ConvertTimeFromUtc(
new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc),
TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")
).IsDaylightSavingTime()
returns 假的?!
这个方法returns false 从new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc)
开始(但是为什么呢?),第二个之前,new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc)
,它returns 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();
2016 年欧洲夏令时于 10 月 30 日结束。据我所知,IsDaylightSavingTime() returning false 是完全正确的。 2015 年夏令时在 10 月 25 日结束,如果您填写该日期和 10 月 24 日 23:59,您将得到相同的结果。
关于时间。
TimeZoneInfo.ConvertTimeFromUtc
的使用将 return 一个 DateTime (10/30/2016 02:59:59),其中 DateTimeKind 是 Unspecified
,这意味着它将调用 TimeZoneInfo.Local.IsDaylightSavingTime
和 return 错误。
像这样将 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 time。
ConvertTimeFromUtc
方法 returns 一种 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);
Casey-obrien 在他的评论中是正确的。原因是一旦翻译成我当地的时区,凌晨 2.00 点到凌晨 2.59 点之间的所有时间都变得模棱两可,因为它们出现了两次:一次在夏令时结束之前,一次在夏令时结束之后。这就是方法 returns false.
的原因凯西,如果你把你的评论写成答案我会接受的。谢谢你。