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å ToString
XmlConvert
. 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);