DateTimeInvalidLocalFormat
Der DateTimeInvalidLocalFormat-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn eine DateTime-Instanz, die als UTC (Universal Coordinated Time, koordinierte Weltzeit) gespeichert ist, mit einem Format formatiert wird, das nur für lokale DateTime-Instanzen verwendet werden soll. Dieser MDA wird nicht für nicht spezifizierte oder DateTime-Standardinstanzen aktiviert.
Eine Anwendung serialisiert manuell eine DateTime-UTC-Instanz unter Verwendung eines lokalen Formats:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
Ursache
Das 'z'-Format der System.DateTime.ToString-Methode enthält die Abweichung der lokalen Zeitzone, z. B. "+10:00" für die australische Zeit. Daher wird nur ein sinnvolles Ergebnis erzielt, wenn der Wert der DateTime lokal ist. Wenn der Wert eine UTC-Zeit ist, enthält System.DateTime.ToString die Abweichung der lokalen Zeitzone. Die Zeitzoneangabe wird aber weder angezeigt noch angepasst.
Lösung
DateTime-UTC-Instanzen sollten auf eine Weise formatiert werden, aus der ersichtlich ist, dass es sich um UTC handelt. Es wird empfohlen, ein 'Z' zu verwenden, um die UTC-Zeit anzugeben:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Es ist außerdem ein "o"-Format vorhanden, mit der eine DateTime unter Verwendung der Kind-Eigenschaft serialisiert wird. Unabhängig davon, ob die Instanz lokal, UTC oder nicht spezifiziert ist, wird hierbei sichergestellt, dass die Serialisierung richtig erfolgt:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Bei der Aktivierung dieses MDA erfolgt keine besondere Ausgabe. Die Aufrufliste kann jedoch verwendet werden, um festzustellen, wo sich der Aufruf von ToString befindet, der den MDA aktiviert hat.
Beispiel: In einer Anwendung wird wie im Folgenden gezeigt ein DateTime-UTC-Wert indirekt mithilfe der XmlConvert-Klasse oder der DataSet-Klasse serialisiert.
DateTime myDateTime = DateTime.UtcNow; String serialized = XMLConvert.ToString(myDateTime);
Die Serialisierungen mit XmlConvert und DataSet verwenden in der Standardeinstellung das lokale Format für die Serialisierung. Zusätzliche Optionen sind erforderlich, um andere Arten von DateTime-Werten zu serialisieren, z. B. UTC.
Übergeben Sie im vorliegenden Beispiel XmlDateTimeSerializationMode.RoundtripKind an den Aufruf von ToString für XmlConvert. Dadurch werden die Daten als UTC-Zeit serialisiert.
Wenn Sie ein DataSet verwenden, legen Sie die DateTimeMode-Eigenschaft des DataColumn-Objekts auf Utc fest.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);
