Wir entwickeln eine C # -Anwendung für einen Webdienst-Client. Dies läuft auf Windows XP-PCs.
Eines der vom Webdienst zurückgegebenen Felder ist ein DateTime-Feld. Der Server gibt ein Feld im GMT-Format zurück, dh mit einem "Z" am Ende.
Wir haben jedoch festgestellt, dass .NET eine implizite Konvertierung durchzuführen scheint und die Zeit immer 12 Stunden abgelaufen ist.
Das folgende Codebeispiel behebt dies bis zu einem gewissen Grad, indem der Unterschied von 12 Stunden weg ist, die Sommerzeit in Neuseeland jedoch nicht berücksichtigt wird.
CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);
Ab diesem Datum Website :
UTC / GMT-Offset
Standardzeitzone: UTC / GMT +12 Stunden
Sommerzeit: +1 Stunde
Aktueller Zeitzonenversatz: UTC / GMT +13 Stunden
Wie stellen wir uns auf die zusätzliche Stunde ein? Kann dies programmgesteuert erfolgen oder handelt es sich um eine Einstellung auf dem PC?
Z
Zeit bezieht sich auf UTC, nicht auf GMT. Die beiden können sich um bis zu 0,9 Sekunden unterscheiden.Antworten:
Für Strings wie
2012-09-19 01:27:30.000
,DateTime.Parse
kann nicht sagen , in welcher Zeitzone Datum und Uhrzeit ist aus.DateTime
hat eine Kind- Eigenschaft, die eine von drei Zeitzonenoptionen haben kann:HINWEIS Wenn Sie ein anderes Datum / eine andere Uhrzeit als UTC oder Ihre lokale Zeitzone darstellen möchten, sollten Sie verwenden
DateTimeOffset
.Also für den Code in Ihrer Frage:
Sie sagen, Sie wissen, um welche Art es sich handelt, also sagen Sie es.
Sobald das System die UTC-Zeit kennt, können Sie einfach anrufen
ToLocalTime
:Dadurch erhalten Sie das gewünschte Ergebnis.
quelle
DateTime convertedTime = new DateTime(DateTime.Parse(dateStr).Ticks), DateTimeKind.Utc);
Kind
vonDateTime
vonUnspecified
nachUTC
ist nicht erforderlich.Unspecified
wird angenommenUTC
für die Zwecke vonToLocalTime
: msdn.microsoft.com/en-us/library/…Ich würde die Verwendung der System.TimeZoneInfo-Klasse prüfen, wenn Sie sich in .NET 3.5 befinden. Siehe http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx . Dies sollte die Änderungen der Sommerzeit korrekt berücksichtigen.
quelle
quelle
DateTime
Objekte haben dieKind
vonUnspecified
der Standardeinstellung, die für die Zwecke derToLocalTime
anzunehmen istUTC
.Um die Ortszeit eines
Unspecified
DateTime
Objekts zu erhalten, müssen Sie daher nur Folgendes tun:Der Schritt des Wechsels
Kind
vonDateTime
vonUnspecified
nachUTC
ist nicht erforderlich.Unspecified
wirdUTC
für folgende Zwecke angenommenToLocalTime
: http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspxquelle
convertedDate.FromLocalTime();
wird konvertieren zuUTC
.Ich weiß, dass dies eine ältere Frage ist, aber ich bin in eine ähnliche Situation geraten und wollte mitteilen, was ich für zukünftige Suchende gefunden habe, möglicherweise auch für mich selbst :).
DateTime.Parse()
kann schwierig sein - siehe hier zum Beispiel.Wenn das
DateTime
von einem Webdienst oder einer anderen Quelle mit einem bekannten Format stammt, sollten Sie etwas in Betracht ziehenoder noch besser,
Das
AssumeUniversal
Flag teilt dem Parser mit, dass Datum und Uhrzeit bereits UTC sind. Die Kombination vonAssumeUniversal
undAdjustToUniversal
weist es an, das Ergebnis nicht in "lokale" Zeit zu konvertieren, was standardmäßig versucht wird. (Ich persönlich versuche sowieso, mich ausschließlich mit UTC in der Geschäfts- / Anwendungs- / Service-Schicht (en) zu befassen. Das Umgehen der Umstellung auf Ortszeit beschleunigt jedoch auch die Dinge - in meinen Tests um 50% oder mehr, siehe unten.)Folgendes haben wir zuvor gemacht:
Wir hatten die App profiliert und festgestellt, dass DateTime.Parse einen signifikanten Prozentsatz der CPU-Auslastung darstellt. (Der
CultureInfo
Konstruktor trug übrigens nicht wesentlich zur CPU-Auslastung bei.)Deshalb habe ich eine Konsolen-App eingerichtet, um eine Datums- / Zeitzeichenfolge 10000 Mal auf verschiedene Arten zu analysieren. Fazit:
Parse()
10 SekundenParseExact()
(Konvertierung in lokal) 20-45 msParseExact()
(keine Konvertierung in lokal) 10-15 ms... und ja, die Ergebnisse für
Parse()
sind in Sekunden angegeben , während die anderen in Millisekunden angegeben sind .quelle
Ich möchte nur einen allgemeinen Hinweis zur Vorsicht hinzufügen.
Wenn Sie nur die aktuelle Uhrzeit von der internen Uhr des Computers abrufen, um ein Datum / eine Uhrzeit auf dem Display oder einen Bericht anzuzeigen, ist alles in Ordnung. Aber wenn Sie die Datums- / Uhrzeitinformationen zur späteren Bezugnahme speichern oder Datum / Uhrzeit berechnen , seien Sie vorsichtig!
Angenommen, Sie stellen fest, dass ein Kreuzfahrtschiff am 20. Dezember 2007 um 15:00 UTC in Honolulu eingetroffen ist. Und Sie möchten wissen, wie spät es war.
1. Es sind wahrscheinlich mindestens drei "Einheimische" beteiligt. Lokal kann Honolulu bedeuten, oder es kann bedeuten, wo sich Ihr Computer befindet, oder es kann bedeuten, wo sich Ihr Kunde befindet.
2. Wenn Sie die integrierten Funktionen verwenden, um die Konvertierung durchzuführen, ist dies wahrscheinlich falsch. Dies liegt daran, dass die Sommerzeit (wahrscheinlich) derzeit auf Ihrem Computer gültig ist, aber im Dezember NICHT in Kraft war. Aber Windows weiß das nicht ... alles, was es hat, ist ein Flag, um festzustellen, ob die Sommerzeit derzeit gültig ist. Und wenn es derzeit in Kraft ist, wird es sogar eine Stunde zu einem Datum im Dezember hinzufügen.
3.Die Sommerzeit wird in verschiedenen politischen Unterteilungen unterschiedlich (oder gar nicht) umgesetzt. Denken Sie nicht, dass andere Länder dies auch tun, nur weil sich Ihr Land an einem bestimmten Datum ändert.
quelle
quelle
Vergessen Sie nicht, wenn Sie bereits ein DateTime-Objekt haben und nicht sicher sind, ob es sich um UTC oder Local handelt. Es ist einfach genug, die Methoden direkt für das Objekt zu verwenden:
Sofern nicht anders angegeben, verwendet .net die lokalen PC-Einstellungen. Ich würde lesen von: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx
Wie es aussieht, könnte der Code ungefähr so aussehen:
Überprüfen Sie, wie oben erwähnt, die Zeitzoneneinstellung Ihres Servers. Es gibt Artikel im Internet, wie Sie die Änderungen in IIS sicher beeinflussen können.
quelle
Als Antwort auf Danas Vorschlag:
Das Codebeispiel sieht nun so aus:
Das ursprüngliche Datum war der 20.08.08; Die Art war UTC.
Sowohl "convertDate" als auch "dt" sind gleich:
21/08/08 10:00:26; Die Art war lokal
quelle
Ich hatte das Problem, dass es sich in einem Datensatz befand, der über die Leitung (Webservice zum Client) übertragen wurde, und dass es sich automatisch ändern würde, da das DateType-Feld der DataColumn auf local gesetzt war. Stellen Sie sicher, dass Sie den DateType überprüfen, wenn Sie DataSets übertragen.
Wenn Sie nicht möchten, dass es sich ändert, setzen Sie es auf Nicht angegeben
quelle
Ich bin auf diese Frage gestoßen, als ich ein Problem mit den UTC-Daten hatte, die Sie über die Twitter-API zurückerhalten (Feld "created_at" für einen Status). Ich muss sie in DateTime konvertieren. Keines der Antworten / Codebeispiele in den Antworten auf dieser Seite war ausreichend, um zu verhindern, dass der Fehler "Zeichenfolge wurde nicht als gültige DateTime erkannt" angezeigt wird (aber es ist das Beste, was ich gefunden habe, um die richtige Antwort auf SO zu finden).
Wenn Sie diesen Link hier posten, falls dies jemand anderem hilft, wurde die Antwort, die ich brauchte, in diesem Blogbeitrag gefunden: http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt-work/ - Verwenden Sie DateTime.ParseExact grundsätzlich mit einer Formatzeichenfolge anstelle von DateTime.Parse
quelle