Die Zeitumstellung am Wochenende hat mir einigen Ärger bereitet.
Ich testete ob bei diversen Projekte der DST-Switch korrekt implementiert ist.
Neben ein paar Unzulänglichkeiten in meinem eigenen Code fand ich einen Bug im .Net-Framework.
Um den Bug zu verifizieren, schrieb ich ein kleines Testprojekt.
Ich addiere / subtrahiere jeweils eine Viertelstunde auf die relevanten DST-Stunden.
Ein paar Zeitstempel lieferten dabei fehlerhafte Berechnung.
Als Workaround ging ich den Umweg über UTC und wandelte wieder in Lokalzeit zurück.
Da war alles korrekt.
Bevor ich ein Fass aufmache: Könnte jemand von euch verifizieren, ob das ein generelles Problem ist oder ob es sich nur in meiner Umgebung so verhält.
Ich testete ob bei diversen Projekte der DST-Switch korrekt implementiert ist.
Neben ein paar Unzulänglichkeiten in meinem eigenen Code fand ich einen Bug im .Net-Framework.
Um den Bug zu verifizieren, schrieb ich ein kleines Testprojekt.
Ich addiere / subtrahiere jeweils eine Viertelstunde auf die relevanten DST-Stunden.
Ein paar Zeitstempel lieferten dabei fehlerhafte Berechnung.
Als Workaround ging ich den Umweg über UTC und wandelte wieder in Lokalzeit zurück.
Da war alles korrekt.
Bevor ich ein Fass aufmache: Könnte jemand von euch verifizieren, ob das ein generelles Problem ist oder ob es sich nur in meiner Umgebung so verhält.
VB.NET-Quellcode
- Module DstTest
- Sub Main()
- Dim t1 = New DateTimeOffset(2019, 10, 27, 1, 45, 0, New TimeSpan(2, 0, 0)) '{27.10.2019 01:45:00 +02:00} (01:45)
- Dim t2 = New DateTimeOffset(2019, 10, 27, 2, 45, 0, New TimeSpan(2, 0, 0)) '{27.10.2019 02:45:00 +02:00} (02:45A)
- Dim t3 = New DateTimeOffset(2019, 10, 27, 2, 45, 0, New TimeSpan(1, 0, 0)) '{27.10.2019 02:45:00 +01:00} (02:45B)
- Dim t4 = New DateTimeOffset(2019, 10, 27, 2, 0, 0, New TimeSpan(2, 0, 0)) '{27.10.2019 02:00:00 +02:00} (02:00A)
- Dim t5 = New DateTimeOffset(2019, 10, 27, 2, 0, 0, New TimeSpan(1, 0, 0)) '{27.10.2019 02:00:00 +01:00} (02:00B)
- Dim t6 = New DateTimeOffset(2019, 10, 27, 3, 0, 0, New TimeSpan(1, 0, 0)) '{27.10.2019 03:00:00 +01:00} (03:00)
- ''Dim q = New TimeSpan(0, 15, 0) '{00:15:00}
- Console.WriteLine("ADD")
- For Each t In {t1, t2, t3}
- ''Console.WriteLine($"add Timespan: t=[{t}] q=[{q}] t+q=[{t + q}]")
- Console.WriteLine($"AddMinutes : t=[{t}] t.AddMinutes(15)=[{t.AddMinutes(15)}]")
- Console.WriteLine($"add via UTC : t=[{t}] t.ToUniversalTime.AddMinutes(15).ToLocalTime=[{t.ToUniversalTime.AddMinutes(15).ToLocalTime}]")
- Console.WriteLine()
- Next
- Console.WriteLine("SUBTRACT")
- For Each t In {t4, t5, t6}
- ''Console.WriteLine($"subtract Timespan: t=[{t}] q=[{q}] t-q=[{t - q}]")
- Console.WriteLine($"AddMinutes : t=[{t}] t.AddMinutes(-15)=[{t.AddMinutes(-15)}]")
- Console.WriteLine($"add via UTC : t=[{t}] t.ToUniversalTime.AddMinutes(-15).ToLocalTime=[{t.ToUniversalTime.AddMinutes(-15).ToLocalTime}]")
- Console.WriteLine()
- Next
- End Sub
- 'Output (.Net Frameworks 4.7.2, 4.6.1, 4.0, 3.0, 2.0) LocalTimeZone=Europe/Berlin (CET/CEST)
- 'ADD
- 'AddMinutes : t=[27.10.2019 01:45:00 +02:00] t.AddMinutes(15)=[27.10.2019 02:00:00 +02:00] '(02:00A)
- 'add via UTC : t=[27.10.2019 01:45:00 +02:00] t.ToUniversalTime.AddMinutes(15).ToLocalTime=[27.10.2019 02:00:00 +02:00] '(02:00A)
- 'AddMinutes : t=[27.10.2019 02:45:00 +02:00] t.AddMinutes(15)=[27.10.2019 03:00:00 +02:00] 'WRONG VALUE (invalid CET/CEST timestamp)
- 'add via UTC : t=[27.10.2019 02:45:00 +02:00] t.ToUniversalTime.AddMinutes(15).ToLocalTime=[27.10.2019 02:00:00 +01:00] '(02:00B)
- 'AddMinutes : t=[27.10.2019 02:45:00 +01:00] t.AddMinutes(15)=[27.10.2019 03:00:00 +01:00] '(03:00)
- 'add via UTC : t=[27.10.2019 02:45:00 +01:00] t.ToUniversalTime.AddMinutes(15).ToLocalTime=[27.10.2019 03:00:00 +01:00] '(03:00)
- 'SUBTRACT
- 'AddMinutes : t=[27.10.2019 02:00:00 +02:00] t.AddMinutes(-15)=[27.10.2019 01:45:00 +02:00] '(01:45)
- 'add via UTC : t=[27.10.2019 02:00:00 +02:00] t.ToUniversalTime.AddMinutes(-15).ToLocalTime=[27.10.2019 01:45:00 +02:00] '(01:45)
- 'AddMinutes : t=[27.10.2019 02:00:00 +01:00] t.AddMinutes(-15)=[27.10.2019 01:45:00 +01:00] 'WRONG VALUE (invalid CET/CEST timestamp)
- 'add via UTC : t=[27.10.2019 02:00:00 +01:00] t.ToUniversalTime.AddMinutes(-15).ToLocalTime=[27.10.2019 02:45:00 +02:00] '(02:45A)
- 'AddMinutes : t=[27.10.2019 03:00:00 +01:00] t.AddMinutes(-15)=[27.10.2019 02:45:00 +01:00] '(02:45B)
- 'add via UTC : t=[27.10.2019 03:00:00 +01:00] t.ToUniversalTime.AddMinutes(-15).ToLocalTime=[27.10.2019 02:45:00 +01:00] '(02:45B)
- End Module
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
--