So konvertieren Sie Datetimes in UTC-basierte Timing-Werte, um Timings zu vergleichen – C#
-
14-12-2019 - |
Frage
Ich habe eine Zeichenfolge (Variable ist fileDate
) mit Datumswerten im folgenden Format:
12.02.2011 11:58 Uhr
Jetzt möchte ich dies in ein Datum und dann in UTC-Zeit umwandeln, da ich Probleme beim Vergleichen von Datumsangaben auf verschiedenen Maschinen habe. Daher möchte ich immer alle Zeichenfolgen (die verglichen werden) in Utc_date-Werte umwandeln.*
Ich habe diesen Code unten ausprobiert, aber er hat nicht funktioniert, da ich die obige Zeichenfolge nicht in eine auf Datum und Uhrzeit basierende Zeichenfolge umwandeln kann (da sie keine Sekunden enthält).
DateTime date = Convert.ToDateTime(fileDate);
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
fileDate = date.ToString("MM/dd/yyyy hh:mm tt");
Oben funktionierte die Anzeige von FormatException nicht.Können Sie mir bitte helfen?
Lösung
Zunächst würde ich die Verwendung empfehlen DateTime.ParseExact
oder TryParseExact
- Mir ist nicht klar, ob Ihre Stichprobe für den 2. Dezember oder den 12. Februar bestimmt ist.Die Angabe des Formats kann durchaus dazu führen, dass Ihr Format entfernt wird FormatException
.
Das nächste Problem besteht darin, herauszufinden, mit welcher Zeitzone Sie es konvertieren möchten. Wollen Sie damit sagen, dass 11:58 eine ist? lokal Zeit in einer Zeitzone, oder es ist bereits eine UTC-Zeit?
- Wenn es sich um eine Ortszeit in der Zeitzone des Codes handelt, der dies ausführt, können Sie Folgendes verwenden
DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal
um es als Teil des Parsens zu tun. - Wenn es bereits eine universelle Zeit ist, verwenden Sie
DateTimeStyles.AssumeUniversal
- Wenn es sich um eine Ortszeit in einer anderen Zeitzone handelt, müssen Sie verwenden
TimeZoneInfo
um die Konvertierung durchzuführen.
Wenn es sich um eine Ortszeit handelt, müssen Sie außerdem zwei Eckfälle berücksichtigen (vorausgesetzt, Sie verwenden eine Zeitzone, in der die Sommerzeit gilt):
- Eine Ortszeit kann sein übersprungen aufgrund von Sommerzeitübergängen, wenn die Uhren vorwärts gehen.Wenn die Uhren also von 1 Uhr morgens auf 2 Uhr morgens springen, dann gibt es 1:30 Uhr überhaupt nicht.
- Eine Ortszeit kann sein mehrdeutig aufgrund von Sommerzeitübergängen, wenn die Uhren zurückgestellt werden.Wenn die Uhren also von 2 Uhr morgens auf 1 Uhr morgens zurückgestellt werden, dann ist es 1:30 Uhr zweimal zu unterschiedlichen UTC-Zeiten – welches Ereignis interessiert Sie?
Sie sollten entscheiden, wie Sie mit diesen Fällen umgehen möchten, und sicherstellen, dass sie in Ihren Unit-Tests abgedeckt werden.
Eine andere Möglichkeit besteht darin, meine Datums- und Uhrzeitbibliothek zu verwenden. Noda-Zeit, wodurch die Konzepte „lokales Datum/Uhrzeit“ und „Datum/Uhrzeit in einer bestimmten Zeitzone“ (und andere) expliziter getrennt werden.
Andere Tipps
Sie sollten verwenden DateTime.ParseExact
um den Wert in eine richtige DateTime-Instanz zu übertragen, und dann können Sie ihn verwenden .ToUniversalTime()
um die UTC-Zeit zu erhalten (dies wäre in Bezug auf den Zeitunterschied wie auf Ihrem Server-Rechner)
Sie können Folgendes verwenden:DateTime.Now.ToUniversalTime();
Ich möchte Ihnen nicht sagen, dass Sie „DateTime.Now“ verwenden sollten, aber Sie verstehen, dass Sie als Teil des DateTime-Objekts eine Methode haben, um es in die Weltzeit umzuwandeln
http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx