当我编译并运行以下针对。net Framework 3.5的程序时,打印到屏幕上的DateTime
是11/1/2006 7:05:00 PM
。(我在美国中部时区。)如果我将我的项目更改为目标。net框架4.0或更高版本并运行该程序,我将提前1小时得到11/1/2006 6:05:00 PM
的输出。
我注意到,当使用框架3.5,如果我改变我的电脑的复选框为夏令时输出更改为下午6:05,但当使用框架4。更改日光节约时间复选框不会影响程序的输出。
这里发生了什么,什么时间是"正确"的时间?为什么改变目标框架会影响这一点呢?
using Newtonsoft.Json;
using System;
namespace Test
{
public class MyData
{
public DateTime? ActivationDate { get; set; }
}
public class Program
{
public static void Main()
{
string json = "{ "ActivationDate":"\/Date(1162425900000-0400)\/"}";
Console.WriteLine(JsonConvert.DeserializeObject<MyData>(json).ActivationDate);
}
}
}
我发现了这个类似的问题(DateTime值在不同版本的。net框架中是不同的),但答案说,这是区域设置,而不是导致问题的框架。然而,这似乎不符合我在我的程序中所看到的,其中除了框架(并重新安装Newtonsoft JSON的Nuget包)之外什么都不改变,似乎影响了输出。
在浏览了许多网站寻找答案后,我偶然发现了https://blog.appliedis.com/2013/03/06/beware-daylight-saving-time-transitions-in-dot-net/,它为我指明了正确的方向。正如下面的测试程序所证明的那样,.NET Framework 3.5显然并没有明确地说明日光节约时间在2006年何时结束:
using System;
namespace Test
{
public class Program
{
public static void Main()
{
DateTime begin = new DateTime(2006, 10, 24);
while (begin < new DateTime(2006, 12, 25))
{
Console.WriteLine(begin + " - " + begin.IsDaylightSavingTime());
begin = begin.AddDays(1);
}
}
}
}
在Framework 3.5上运行编译后的程序得到如下结果:
10/24/2006 12:00:00 AM - True
10/25/2006 12:00:00 AM - True
10/26/2006 12:00:00 AM - True
10/27/2006 12:00:00 AM - True
10/28/2006 12:00:00 AM - True
10/29/2006 12:00:00 AM - True
10/30/2006 12:00:00 AM - True
10/31/2006 12:00:00 AM - True
11/1/2006 12:00:00 AM - True
11/2/2006 12:00:00 AM - True
11/3/2006 12:00:00 AM - True
11/4/2006 12:00:00 AM - True
11/5/2006 12:00:00 AM - True
11/6/2006 12:00:00 AM - False
11/7/2006 12:00:00 AM - False
11/8/2006 12:00:00 AM - False
11/9/2006 12:00:00 AM - False
11/10/2006 12:00:00 AM - False
11/11/2006 12:00:00 AM - False
在Framework 4.0上运行时显示如下:
10/24/2006 12:00:00 AM - True
10/25/2006 12:00:00 AM - True
10/26/2006 12:00:00 AM - True
10/27/2006 12:00:00 AM - True
10/28/2006 12:00:00 AM - True
10/29/2006 12:00:00 AM - True
10/30/2006 12:00:00 AM - False
10/31/2006 12:00:00 AM - False
11/1/2006 12:00:00 AM - False
11/2/2006 12:00:00 AM - False
11/3/2006 12:00:00 AM - False
11/4/2006 12:00:00 AM - False
11/5/2006 12:00:00 AM - False
11/6/2006 12:00:00 AM - False
11/7/2006 12:00:00 AM - False
11/8/2006 12:00:00 AM - False
11/9/2006 12:00:00 AM - False
11/10/2006 12:00:00 AM - False
11/11/2006 12:00:00 AM - False
至少看起来微软意识到了这个问题。https://support.microsoft.com/en-us/kb/933509