反序列化的DateTime值在.NET框架的不同版本中发生更改

时间:2016-08-08 21:10:53

标签: c# serialization .net-4.0 json.net .net-3.5

当我编译并运行以下针对.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,但使用Framework 4.x时,更改夏令时复选框不会影响该计划的输出。

这里发生了什么,哪个时间是“正确”的时间?为什么改变目标框架会影响到它?

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包)似乎正在影响输出。

1 个答案:

答案 0 :(得分:2)

在寻找答案的众多网站中,我偶然发现了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