DateTimeInvalidLocalFormat-MDA

Hinweis

Dieser Artikel gilt für das .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der dateTimeInvalidLocalFormat-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn eine als UTC (Universal Coordinated Time, koordinierte Weltzeit) gespeicherte DateTime-Instanz mit einem Format formatiert wird, das nur für lokale DateTime-Instanzen verwendet werden soll. Dieser MDA wird nicht für nicht angegebene oder DateTime-Standardinstanzen aktiviert.

Symptom

Eine Anwendung führt für eine DateTime-UTC-Instanz eine manuelle Serialisierung mit einem lokalen Format durch:

DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));

Ursache

Das „z“-Format der DateTime.ToString-Methode beinhaltet die Abweichung der lokalen Zeitzone, beispielsweise „+ 10:00“ für Ortszeit Sydney. Daher wird nur ein aussagekräftiges Ergebnis erzielt, wenn der Wert für DateTime lokal ist. Gibt der Wert die UTC-Zeit an, beinhaltet DateTime.ToString zwar die Abweichung der lokalen Zeitzone, der Zeitzonenbezeichner wird aber weder angezeigt noch angepasst.

Lösung

DateTime-UTC-Instanzen sollten so formatiert werden, dass sie als UTC erkennbar sind. Es wird empfohlen, für die Angabe von UTC-Zeiten ein „Z“ zu verwenden:

DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));

Zudem existiert ein „o“-Format, mit dem eine DateTime mithilfe der Kind-Eigenschaft serialisiert werden kann. Diese Eigenschaft führt unabhängig davon, ob die Instanz lokal, UTC oder nicht angegeben ist, eine korrekte Serialisierung durch:

DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die Laufzeit.

Output

Das Aktivieren dieses MDA erzeugt keine besondere Ausgabe. Die Aufrufliste kann jedoch zur Bestimmung des Speicherorts für den ToString-Aufruf verwendet werden, der den MDA aktiviert hat.

Konfiguration

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

Beispiel

In einer Anwendung wird wie im Folgenden gezeigt eine indirekte Serialisierung für einen DateTime-UTC-Wert mithilfe der Klasse XmlConvert oder DataSet durchgeführt:

DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);

Die Serialisierungen mit XmlConvert und DataSet verwenden standardmäßig lokale Formate zur Serialisierung. Zusätzliche Optionen sind erforderlich, um andere Arten von DateTime-Werten, z.B. UTC, zu serialisieren.

Übergeben Sie im vorliegenden Beispiel XmlDateTimeSerializationMode.RoundtripKind an den Aufruf von ToString für XmlConvert. Dadurch werden die Daten als UTC-Zeit serialisiert.

Bei Verwendung von DataSet legen Sie die DateTimeMode-Eigenschaft des DataColumn-Objekts auf Utc fest.

DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
    XmlDateTimeSerializationMode.RoundtripKind);

Siehe auch