2016-08-08 70 views
0

Wenn ich das folgende Programm kompilieren und ausführen, das auf .NET Framework 3.5 abzielt, ist die DateTime, die auf dem Bildschirm gedruckt wird, 11/1/2006 7:05:00 PM. (Ich bin in der zentralen Zeitzone.) Wenn ich mein Projekt auf .NET Framework 4.0 oder höher als Ziel ändern und das Programm ausführen, erhalte ich eine Ausgabe von 11/1/2006 6:05:00 PM, 1 Stunde früher.Deserialized DateTime Wert ändert sich über verschiedene Versionen von .NET Framework

Ich habe festgestellt, dass bei der Verwendung von Framework 3.5, wenn ich das Kontrollkästchen des Computers für die Sommerzeit ändern die Ausgabe auf 6:05 PM, aber wenn Framework 4.x Änderungen an der Sommerzeit-Kontrollkästchen nicht tun beeinflussen die Ausgabe des Programms.

Was ist hier los und welche Zeit ist die "richtige" Zeit? Warum würde sich das Ändern des Zielrahmens auf das auswirken?

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); 
     } 
    } 
} 

Ich fand diese ähnliche Frage (DateTime value is different across different versions of .NET framework), aber die Antwort sagt, dass es die lokalen Einstellungen und nicht der Rahmen, die das Problem verursachen. Dies scheint jedoch nicht in Übereinstimmung mit dem zu sein, was ich mit meinem Programm beobachte, wobei die Änderung des Frameworks (und Neuinstallation des Nuget-Pakets für Newtonsoft JSON) die Ausgabe zu beeinflussen scheint.

+0

Vielleicht hat einige nützliche verwandte Informationen: https://StackOverflow.com/Questions/10029099/Datetime-Parse2012-09-30T230000-0000000Z-Always-Converts-to-DateTimeKind-l, insbesondere mit .NET Version Unterschiede. Ich gehe davon aus, dass Json.NET die Parse-Implementierung von 'DateTime' verwendet, also ist dies wirklich mehr eine 'DateTime'-Frage als alles, was mit Serialisierung oder Json.NET zu tun hat –

Antwort

2

Nach dem Durchsuchen von zahlreichen Websites auf der Suche nach einer Antwort stolperte ich über https://blog.appliedis.com/2013/03/06/beware-daylight-saving-time-transitions-in-dot-net/, die mich in die richtige Richtung wies. Wie sich herausstellt, 3.5 .NET Framework offenbar nicht über ein klares Bild über, wenn die Sommerzeit im Jahr 2006 beendet, wie durch dieses Testprogramm belegt:

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); 
      } 
     } 
    } 
} 

Das Ausführen dieses Programms gegen Rahmen zusammengestellt 3.5 gibt die folgenden Ergebnisse :

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 

während es gegen Framework 4.0 zeigt den Lauf:

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 

mindestens es sieht aus wie Microsoft das Problem bekannt ist. https://support.microsoft.com/en-us/kb/933509