Sicher konvertieren UTC-datetimes lokale Zeit (basierend auf TZ) für die Berechnungen?
Folgenden aus meiner Letzte Frage die @Jon Skeet gab mir viel Hilfe (danke nochmal!)
Ich bin jetzt Fragen, wie kann ich sicher arbeiten mit Datum/Zeiten als UTC gespeichert, wenn Sie konvertiert sind zurück zum Lokalen Datum/Zeit.
Als Jon angegeben, in meiner letzten Frage mit DateTimeOffset
stellt eine sofortige in der Zeit und es gibt keine Möglichkeit, vorherzusagen, was die lokale Zeit würde sagen, eine minute später. Ich muss in der Lage sein zu tun Berechnungen auf der Grundlage dieser Datum/Zeit.
Also, wie kann ich gewährleisten, wenn ich ziehen Sie die Daten aus der Datenbank, konvertieren Sie lokale Datum/Zeit und bestimmte Berechnungen auf Ihnen, Sie gehen, um genau zu sein?
Szenario
Meiner Anwendung Datensätze gesendeten Informationen via E-Mail. Datum/Zeit der E-Mail empfangen wird aufgezeichnet, wie die Einreichung Zeit. E-Mails sind gezogen von exchange.
Was ich wissen muss ist:
1), Wenn diese E-Mails kommen aus verschiedenen Ländern, muss ich erst konvertieren, die Recieved
Datum/Zeit der E-Mail an UTC-format und speichern? z.B. Email.Received.ToUniversalTime()
Spielt es eine Rolle, ob Sie lokale oder nicht? Wenn der DateTimeOffset-nur gibt mir einen Augenblick in der Zeit, sind die Berechnungen gehen korrekt?
Sie sind wirklich fehlt der Punkt UTC. Es ist das gleiche überall in der Welt. nicht konvertieren.
Mein Punkt ist - Sagen, ich habe ein Datum/Zeit in Großbritannien, das Datum/die Zeit ist nicht das gleiche in verschiedenen Zeitzonen. So sagen, es war für den Aussie, ich brauche, um zu konvertieren UTC-Zeit in lokale Zeit um das zu tun Berechnungen, die auf es (als Datum der
15/04/2010 18:00
im UK-Zeit, Ergebnisse in so etwas wie 16/04/2010 04:00
Aussie-Zeit)InformationsquelleAutor James | 2010-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, kann man nicht davon ausgehen, dass. UTC-Zeit ist komplett linear, und Sie können sicher tun Berechnungen auf Sie. Sobald Sie konvertiert es in eine lokale Zeit, es ist nicht mehr ganz linear.
Wenn die Sommerzeit-änderungen auftreten, es gibt eine überlappung oder eine Lücke in der lokalen Zeit. Wenn Sie eine Berechnung, die erstreckt sich über ein Tageslicht-Spar-Zeit ändern, wird das Ergebnis von einer Stunde deaktiviert sein (wenn das ist, wie viel die Zeit ändert, das ist die häufigste).
Wenn Sie die Berechnung vor der Konvertierung von DateTime - /DateTimeOffset-Wert in die lokale Zeit, das Ergebnis wird immer richtig sein. Beachten Sie jedoch, dass die Konvertierung den Wert einer lokalen DateTime-Wert wird es mehrdeutig, wenn der Wert zu fallen geschieht, die innerhalb einer sich an die Sommerzeit zu ändern, es ist unmöglich zu sagen, ob es das erste oder zweite mal, dass die genaue Zeit Auftritt an diesem Tag.
ToLocalTime()
ich meine so etwas wieConvertTimeBySystemTimeZoneId
.Ich bin nicht wirklich davon nichts 🙂
Nein, wenn Sie konvertiert haben, die Wert auf einen Zeit-zone, es ist nicht mehr UTC-Zeit. Allerdings, wenn Sie mit DateTimeOffset-es ist der offset entsprechend geändert wird, so können Sie wandeln es wieder auf die ursprüngliche UTC-Zeit. Der DateTimeOffset-Wert enthält den offset von der UTC-Zeit, aber nicht Zeit-zone, so dass während der Konvertierung zurück zu UTC ist sicher, Berechnungen auf DateTimeOffset-Werten nicht die Sommerzeit berücksichtigt. Wenn Sie concvert UTC, tun die Berechnung und zurück konvertieren, die Berechnung zu korrigieren.
Siehe aktualisierten post.
Die empfangene Datum in der E-mail hat einen zeitlichen Versatz, so entspricht es in einen DateTimeOffset-Wert. Wenn Sie können erfolgreich analysiert werden, in einen DateTimeOffset-Wert, können Sie sicher konvertieren auf UTC, und speichern Sie einen DateTime-Wert als eindeutiger Punkt in der Zeit. Aus, die Sie konvertieren können es zu jeder Zeit-zone, so dass Sie können anzeigen in anyones lokale Zeit, wenn Sie möchten.
InformationsquelleAutor Guffa
Ist der sicherste Weg zu behandeln, Datum/Zeit richtig ist, um alles zu speichern, als UTC-Zeit und zeigt Sie in der lokalen Zeit. Alle Datums - /Zeit-Mathematik sollte in UTC als Guffa schlägt. Store in UTC konvertieren und auf die lokale Zeit auf die Fliegen, wie Sie es darstellen.
Zu machen, wie Zeit-Zone bewusst, Datum/Zeit
Microsoft hat einen Artikel auf, wie zur Kapselung einer DateTime-und TimeZoneInfo-Variablen in einer Struktur hier.
Hier ist der Microsoft Beispiel-Struktur mit 1-Eigenschaft Hinzugefügt, um leicht zu bekommen Ortszeit. Dieses muss mehr arbeiten, um ein voll nützlich, aber es ist ein guter Anfang.
Ihr Szenario
Ja, verwenden Sie entweder die E-mail-Objekts ReceivedTime oder SentOn und konvertieren von UTC für die Lagerung & Berechnungen. Dies ist viel weniger Komplex als die Beispiele oben.
Ich verstehe nicht, was du meinst zwischen dem server und dem lokalen Zeitzone UTC. UTC ist die Weltzeit, es gibt keine Schwankungen.
Wenn Sie nicht wissen, ob Sie einen server verwenden, auf Zeit oder client-Zeit, dann verwenden Sie immer die Zeit auf dem server. (In jedem Fall sollte es UTC @chilltemp sagt.) Mit der Zeit auf dem server macht die Daten gleichmäßig für alle Benutzer, und es ist besser für die Sicherheit, da man in der Regel keine Kontrolle über die client-Zeit-Einstellungen.
Das war es, was ich meine, lol, Dank!
ist richtig. Server-Zeit ist am besten für Konstanz. Die Ausnahme wäre der offline-clients. Sie müssen die client-Zeit (UTC), wenn der client nicht über einen aktiven Kanal auf den server und kommunizieren, die Daten zu einem späteren Zeitpunkt (z.B. batch-Kommunikation).
InformationsquelleAutor chilltemp