Freigeben über


dateTimeInvalidLocalFormat MDA

Hinweis

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

Die dateTimeInvalidLocalFormat MDA wird aktiviert, wenn eine DateTime Instanz, die als utc (Universal Coordinated Time) gespeichert ist, mit einem Format formatiert wird, das nur für lokale DateTime Instanzen verwendet werden soll. Diese MDA wird für nicht angegebene oder Standardinstanzen DateTime nicht aktiviert.

Symptom

Eine Anwendung serialisiert manuell eine UTC-Instanz DateTime mit einem lokalen Format:

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

Ursache

Das Format "z" für die DateTime.ToString Methode enthält den Lokalen Zeitzonenoffset, z. B. "+10:00" für Sydney-Zeit. Daher wird nur dann ein aussagekräftiges Ergebnis erzeugt, wenn der Wert der DateTime Lokalen ist. Wenn der Wert UTC-Zeit ist, DateTime.ToString schließt den Offset der lokalen Zeitzone ein, zeigt den Zeitzonenbezeichner jedoch nicht an oder passt ihn an.

Resolution

UTC-Instanzen DateTime sollten auf eine Weise formatiert werden, die angibt, dass sie UTC sind. Das empfohlene Format für UTC-Zeiten für die Verwendung eines "Z", um UTC-Zeit zu kennzeichnen:

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

Es gibt auch ein "o"-Format, das die DateTime Verwendung der Kind Eigenschaft serialisiert, die ordnungsgemäß serialisiert wird, unabhängig davon, ob die Instanz lokal, UTC oder nicht angegeben ist:

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

Effekt auf die Laufzeit

Diese MDA wirkt sich nicht auf die Laufzeit aus.

Output

Aufgrund dieser MDA-Aktivierung gibt es keine spezielle Ausgabe. Der Aufrufstapel kann jedoch verwendet werden, um die Position des Aufrufs zu bestimmen, der ToString die MDA aktiviert hat.

Konfiguration

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

Beispiel

Erwägen Sie eine Anwendung, die einen UTC-Wert DateTime indirekt serialisiert, indem Sie die klasse oder DataSet die XmlConvert folgende Art verwenden.

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

Bei den XmlConvert Serialisierungen werden DataSet standardmäßig lokale Formate für die Serialisierung verwendet. Zusätzliche Optionen sind erforderlich, um andere Arten von DateTime Werten zu serialisieren, z. B. UTC.

Übergeben XmlDateTimeSerializationMode.RoundtripKind Sie für dieses bestimmte Beispiel an den Anruf XmlConvertan .ToString Dadurch werden die Daten als UTC-Zeit serialisiert.

Wenn Sie eine DataSet, legen Sie die DateTimeMode Eigenschaft für das DataColumn Objekt auf Utc.

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

Siehe auch