Share via


dateTimeInvalidLocalFormat-MDA

Aktualisiert: November 2007

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.

Symptom

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 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 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"));

Auswirkungen auf die Laufzeit

Dieser MDA beeinflusst die Laufzeit nicht.

Ausgabe

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.

Konfiguration

<mdaConfig>
  <assistants>
    <dateTimeInvalidLocalFormat />
  </assistants>
</mdaConfig>

Beispiel

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);

Siehe auch

Konzepte

Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen

Referenz

DateTimeFormatInfo