Dela via


dateTimeInvalidLocalFormat MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

dateTimeInvalidLocalFormat MDA aktiveras när en DateTime instans som lagras som en UNIVERSAL Coordinated Time (UTC) formateras med ett format som endast är avsett att användas för lokala DateTime instanser. Denna MDA aktiveras inte för ospecificerade eller standardinstanser DateTime .

Symptom

Ett program serialiserar en UTC-instans DateTime manuellt med ett lokalt format:

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

Orsak

Formatet z för DateTime.ToString metoden innehåller den lokala tidszonsförskjutningen, till exempel "+10:00" för Sydney-tid. Därför ger det bara ett meningsfullt resultat om värdet för DateTime är lokalt. Om värdet är UTC-tid inkluderar DateTime.ToString det lokala tidszonsförskjutningen, men det visar eller justerar inte tidszonsspecificeraren.

Åtgärd

UTC-instanser DateTime ska formateras på ett sätt som anger att de är UTC. Det rekommenderade formatet för UTC-tider för att använda "Z" för att ange UTC-tid:

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

Det finns också ett "o"-format som serialiserar en DateTime användning av Kind egenskapen som serialiseras korrekt oavsett om instansen är lokal, UTC eller ospecificerad:

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

Effekt på körningen

Detta MDA påverkar inte körningen.

Output

Det finns inga särskilda utdata som ett resultat av denna MDA-aktivering., Men anropsstacken kan användas för att fastställa platsen för anropet ToString som aktiverade MDA.

Konfiguration

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

Exempel

Överväg ett program som indirekt serialiserar ett UTC-värde DateTime med hjälp XmlConvert av klassen eller DataSet på följande sätt.

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

Serialiseringarna XmlConvert och DataSet använder lokala format för serialisering som standard. Ytterligare alternativ krävs för att serialisera andra typer av DateTime värden, till exempel UTC.

I det här specifika exemplet skickar du in XmlDateTimeSerializationMode.RoundtripKind till anropet på ToStringXmlConvert. Detta serialiserar data som en UTC-tid.

Om du använder en DataSetanger du DateTimeMode egenskapen för objektet DataColumn till Utc.

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

Se även