dateTimeInvalidLocalFormat MDA
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De dateTimeInvalidLocalFormat
MDA wordt geactiveerd wanneer een DateTime exemplaar dat is opgeslagen als een UNIVERSAL Coordinated Time (UTC) wordt geformatteerd met behulp van een indeling die alleen voor lokale DateTime exemplaren moet worden gebruikt. Deze MDA is niet geactiveerd voor niet-opgegeven of standaardexemplaren DateTime .
Symptoom
Een toepassing serialiseert een UTC-exemplaar DateTime handmatig met behulp van een lokale indeling:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
Oorzaak
De 'z'-indeling voor de DateTime.ToString methode bevat de offset van de lokale tijdzone, bijvoorbeeld '+10:00' voor sydneytijd. Als zodanig levert het alleen een zinvol resultaat op als de waarde van de DateTime lokale waarde is. Als de waarde UTC-tijd is, neemt u de offset van de lokale tijdzone op, DateTime.ToString maar wordt de tijdzoneaanduiding niet weergegeven of aangepast.
Oplossing
UTC-exemplaren DateTime moeten worden opgemaakt op een manier die aangeeft dat ze UTC zijn. De aanbevolen indeling voor UTC-tijden om een 'Z' te gebruiken om UTC-tijd aan te geven:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Er is ook een o-indeling waarmee een DateTime eigenschap Kind wordt geserialiseerd die correct wordt geserialiseerd, ongeacht of het exemplaar lokaal, UTC of niet is opgegeven:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Effect op de runtime
Deze MDA heeft geen invloed op de runtime.
Uitvoer
Er is geen speciale uitvoer als gevolg van deze MDA-activering. De aanroepstack kan echter worden gebruikt om de locatie van de ToString aanroep te bepalen die de MDA heeft geactiveerd.
Configuratie
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Opmerking
Overweeg een toepassing die indirect een UTC-waarde DateTime serialiseert met behulp van de XmlConvert of DataSet klasse, op de volgende manier.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
De XmlConvert en DataSet serialisaties maken standaard gebruik van lokale indelingen voor serialisatie. Er zijn extra opties vereist voor het serialiseren van DateTime andere soorten waarden, zoals UTC.
Voor dit specifieke voorbeeld geeft u XmlDateTimeSerializationMode.RoundtripKind
de ToString
oproep door XmlConvert
. Hiermee worden de gegevens geserialiseerd als utc-tijd.
Als u een DataSet, stelt u de DateTimeMode eigenschap voor het DataColumn object in op Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);