2017-06-16 1 views
0

Ich benutze die Noda Time libarary (v 2.0.3) für die Verarbeitung der Datumszeit in einem .net Kernprojekt. Jedoch; Ich habe einige Probleme beim Konvertieren eines Augenblicks in ein MEZ-Datum.Noda Time Sofort zu CET

Ich bin relativ neu zu Noda Time, möglicherweise mit falsch (ist nicht CET tz-db-Eintrag auf CET überhaupt)?

Beispielcode

// get current system instant 
var systemInstant = SystemClock.Instance.GetCurrentInstant(); 

// get oslo zoneddatetime from instant 
var osloDateTime = systemInstant.InZone(DateTimeZoneProviders.Tzdb["Europe/Oslo"]); 
// get CET(?) zoneddatetime from instant 
var cetDateTime = systemInstant.InZone(DateTimeZoneProviders.Tzdb["CET"]); 

// output 
Debug.WriteLine(osloDateTime.ToString()); 
Debug.WriteLine(cetDateTime.ToString()); 

Die Ausgabe aus dem Beispielcode mir oben gibt:

2017-06-16T22:28:16 Europe/Oslo (+02) 
2017-06-16T22:28:16 CET (+02) 

Acutally wurde ich erwarte die MEZ Zeit 21.28.16 (UTC + 1) zu sein, in Zonen aufgeteilt und nicht 22:28:16 (UTC + 2). UTC + 1 ist auch was die Time and date website anzeigt.

+0

BTW - Wenn Sie eine Zeitzone wünschen, die das ganze Jahr über UTC + 1 ist, können Sie 'Etc/GMT-1' verwenden. –

Antwort

3

Die Zone Zeile der europe Datei in der IANA-Zeitzone-Datenbank enthält diese einzelne Zeile für die CET Zone ID:

Zone CET  1:00 C-Eur CE%sT 

das Ende Wiederholung der C-Eur Regel Dann ist dieses Paar von Leitungen:

Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S 
Rule C-Eur 1996 max - Oct lastSun 2:00s 0 - 

Also geht es am letzten Sonntag im März jedes Jahr um 2 Uhr morgens in UTC + 2 und am letzten Sonntag im Oktober jedes Jahr um 2 Uhr morgens zurück nach UTC + 1.

Beachten Sie, dass die "Abkürzung" in der CET-Zeitzone zwischen "CET" und "CEST" variiert - und das könnte Sie irreführen. Aber Noda Time ist nach der Definition der ID "CET" wie in der IANA-Datenbank.

Dies ist nur ein weiterer Grund, die Abkürzungen zu vermeiden und statt dessen vollständige Zonen-IDs wie Europe/Oslo zu verwenden, die eindeutig sind. Ich würde vorschlagen zu vermeiden, zu versuchen, das Konzept einer "CET Date-Time" vollständig zu verwenden.

+0

Danke, alles macht jetzt viel mehr Sinn. Wie Sie vorgeschlagen haben, war es der CET/CEST-Unterschied, der mich verwirrte. – Indregaard

1

Wenn Sie das Ergebnis von DateTimeZoneProviders.Tzdb ["CET"] betrachten, hat es einen minimalen Offset von +1 und einen maximalen Offset von +2, also denke ich, dass es sich auf die tatsächliche zentraleuropäische Zeitzone (einschließlich die mitteleuropäische Sommerzeit [MESZ]).

Da das ausgewählte Datum in den Sommerzeitbereich fällt, ist es UTC + 2.

Wenn Sie versuchen, die folgenden erhalten Sie UTC + 1 für CET:

Instant.FromDateTimeUtc(new DateTime(2017, 01, 01, 12, 0, 0, DateTimeKind.Utc)).InZone(DateTimeZoneProviders.Tzdb["CET"] 
Verwandte Themen