跨不同版本的 .NET 框架的反序列化 DateTime 值更改

Deserialized DateTime value changes across different versions of the .NET framework

当我编译和 运行 以下针对 .NET Framework 3.5 的程序时,打印到屏幕上的 DateTime11/1/2006 7:05:00 PM。 (我在中部时区。)如果我将项目更改为目标 .NET Framework 4.0 或更高版本和 运行 程序,我会提前 1 小时获得 11/1/2006 6:05:00 PM 的输出。

我注意到,在使用 Framework 3.5 时,如果我将计算机的夏令时复选框更改为 6:05 PM,但在使用 Framework 4.x 时,会更改夏令时时间复选框不影响程序的输出。

这里发生了什么,"correct"时间是几点?为什么更改目标框架会影响它?

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 value is different across different versions of .NET framework),但答案是区域设置而不是框架导致了这个问题。然而,这似乎与我在我的程序中看到的不一致,其中除了框架之外什么都不改变(并为 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