反序列化的DateTime值在不同版本的.net框架中会发生变化

本文关键字:框架 变化 net 版本 DateTime 反序列化 | 更新日期: 2023-09-27 18:01:18

当我编译并运行以下针对。net Framework 3.5的程序时,打印到屏幕上的DateTime11/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包)之外什么都不改变,似乎影响了输出。

反序列化的DateTime值在不同版本的.net框架中会发生变化

在浏览了许多网站寻找答案后,我偶然发现了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