Ich versuche, einen Komponententest zu erstellen, um den Fall zu testen, wenn sich die Zeitzone auf einer Maschine ändert, weil sie falsch eingestellt und dann korrigiert wurde.
Im Test muss ich in der Lage sein, DateTime-Objekte in einer nicht lokalen Zeitzone zu erstellen, um sicherzustellen, dass Personen, die den Test ausführen, dies erfolgreich tun können, unabhängig davon, wo sie sich befinden.
Nach dem, was ich im DateTime-Konstruktor sehen kann, kann ich die Zeitzone entweder als lokale Zeitzone, als UTC-Zeitzone oder nicht angegeben festlegen.
Wie erstelle ich eine DateTime mit einer bestimmten Zeitzone wie PST?
Antworten:
Jons Antwort spricht von TimeZone , aber ich würde vorschlagen, stattdessen TimeZoneInfo zu verwenden.
Persönlich mag ich es, Dinge in UTC zu behalten, wo dies möglich ist (zumindest für die Vergangenheit; das Speichern von UTC für die Zukunft hat potenzielle Probleme ), daher würde ich eine Struktur wie diese vorschlagen:
Vielleicht möchten Sie die "TimeZone" -Namen in "TimeZoneInfo" ändern, um die Dinge klarer zu machen - ich bevorzuge die kürzeren Namen selbst.
quelle
Die DateTimeOffset-Struktur wurde für genau diese Art der Verwendung erstellt.
Siehe: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Hier ist ein Beispiel für das Erstellen eines DateTimeOffset-Objekts mit einer bestimmten Zeitzone:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
quelle
Die anderen Antworten hier sind nützlich, behandeln jedoch nicht speziell den Zugriff auf Pacific - los geht's:
Seltsamerweise bezieht sich "Pacific Standard Time" normalerweise auf etwas anderes als "Pacific Daylight Time", in diesem Fall jedoch auf die Pacific Time im Allgemeinen. Wenn Sie es
FindSystemTimeZoneById
zum Abrufen verwenden, ist eine der verfügbaren Eigenschaften ein Bool, der Ihnen sagt, ob diese Zeitzone derzeit in der Sommerzeit ist oder nicht.Sie können allgemeinere Beispiele dafür in einer Bibliothek sehen, die ich letztendlich zusammengestellt habe, um mit DateTimes umzugehen, die ich in verschiedenen Zeitzonen benötige, je nachdem, woher der Benutzer fragt, usw.:
https://github.com/b9chris/TimeZoneInfoLib.Net
Dies funktioniert außerhalb von Windows nicht (z. B. Mono unter Linux), da die Liste der Zeiten aus der Windows-Registrierung stammt:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
Darunter finden Sie Schlüssel (Ordnersymbole im Registrierungseditor); Die Namen dieser Schlüssel sind das, woran Sie übergeben
FindSystemTimeZoneById
. Unter Linux müssen Sie einen separaten Satz von Zeitzonendefinitionen nach Linux-Standard verwenden, die ich nicht ausreichend untersucht habe.quelle
Ich habe die Antwort von Jon Skeet für das Web mit der Erweiterungsmethode ein wenig geändert . Es funktioniert auch auf Azurblau wie ein Zauber.
quelle
Dafür müssen Sie ein benutzerdefiniertes Objekt erstellen. Ihr benutzerdefiniertes Objekt enthält zwei Werte:
Ich bin nicht sicher, ob es bereits einen von der CLR bereitgestellten Datentyp gibt, der diesen hat, aber zumindest die TimeZone-Komponente ist bereits verfügbar.
quelle
Ich mag Jon Skeets Antwort, möchte aber eines hinzufügen. Ich bin mir nicht sicher, ob Jon erwartet hat, dass der Ctor immer in der lokalen Zeitzone übergeben wird. Aber ich möchte es für Fälle verwenden, in denen es etwas anderes als lokal ist.
Ich lese Werte aus einer Datenbank und weiß, in welcher Zeitzone sich diese Datenbank befindet. Im ctor übergebe ich also die Zeitzone der Datenbank. Aber dann möchte ich den Wert in Ortszeit. Jons LocalTime gibt nicht das ursprüngliche Datum zurück, das in ein lokales Zeitzonendatum konvertiert wurde. Es gibt das Datum zurück, das in die ursprüngliche Zeitzone konvertiert wurde (was auch immer Sie an den ctor übergeben haben).
Ich denke, diese Eigenschaftsnamen klären es auf ...
quelle
Die Verwendung der TimeZones- Klasse erleichtert das Erstellen eines zeitzonenspezifischen Datums.
quelle