2016-08-08 3 views
0

Когда я компилирую и запускаю следующую программу, предназначенную для платформы .NET Framework 3.5, DateTime, напечатанный на экране, - 11/1/2006 7:05:00 PM. (Я нахожусь в Центральном часовом поясе.) Если я изменю свой проект на целевую платформу .NET 4.0 или выше и запустил программу, я получаю вывод 11/1/2006 6:05:00 PM, на 1 час раньше.Изменения десериализованного значения DateTime в разных версиях .NET Framework

Я заметил, что при использовании 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), но ответ говорит, что именно региональные настройки и не рамочные, которые вызывают проблемы. Тем не менее, похоже, это не соответствует тому, что я наблюдаю в своей программе, в которой изменение результата (и переустановка пакета Nuget для Newtonsoft JSON) не влияет на результат.

+0

Возможно, у него есть полезная информация: https://stackoverflow.com/questions/10029099/datetime-parse2012-09-30t230000-0000000z-always-converts-to-datetimekind-l, особенно по сравнению с версиями версии .NET. Я предполагаю, что Json.NET использует реализацию синтаксического анализа 'DateTime', поэтому это скорее вопрос' DateTime', чем что-либо, что связано с сериализацией или Json.NET –

ответ

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 

по крайней мере, похоже, Microsoft осознает проблемы. https://support.microsoft.com/en-us/kb/933509

Смежные вопросы