IsDaylightSavingTime奇怪的行为

时间:2017-02-14 18:19:16

标签: c# datetime timezone utc

为什么方法IsDaylightSavingTime()会返回特定小时范围内明显错误的值?从UTC日期开始,我要明确无误。时间$(document).ready(function() { $.ajax({ type : 'POST', url : 'server.php', dataType:"application/json", success : function (data) { var jsns=JSON.parse(data); $("#orders").html("");//clear the div for(var i in data) { var id = data[i].id; var name = data[i].name; $("#orders").append("<span>"+id+"-"+name+</span>);//append each element } } }); }); 是西部夏令时的最后一分钟。实际上在WEST它提供了2小时的偏移(2.59 am),而一分钟后则有1小时(上午2点)的偏移。但后来为什么:

new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc)

返回false?!

此方法从TimeZoneInfo.ConvertTimeFromUtc( new DateTime(2016, 10, 30, 0, 59, 0, DateTimeKind.Utc), TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time") ).IsDaylightSavingTime() 开始返回false(但为什么?),之前的第二个new DateTime(2016, 10, 30, 0, 0, 0, DateTimeKind.Utc),它返回true。

TimeZoneInfo方法似乎有效:

new DateTime(2016, 10, 29, 23, 59, 59, DateTimeKind.Utc)

3 个答案:

答案 0 :(得分:0)

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 DateTime传递给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这些日子。

答案 1 :(得分:0)

Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Set KeyCells = Range("A6") If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then Call Macro End If End Sub 方法返回ConvertTimeFromUtc类型,使用DateTime类型的IsDaylightSavingTime方法实现方式不同。

请尝试使用以下代码...

TimeZoneInfo

答案 2 :(得分:0)

Casey-obrien的评论是正确的。原因是,一旦翻译成我当地的时区,凌晨2点到凌晨2点29分之间的所有时间都变得模棱两可,因为它们发生了两次:一次在dst结束之前,一次之后。这就是该方法返回false的原因。

凯西,如果你把评论写成答案,我会接受。谢谢。