dateTimeInvalidLocalFormat MDA

Nota

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

dateTimeInvalidLocalFormat MDA diaktifkan saat DateTime instans yang disimpan sebagai Universal Coordinated Time (UTC) diformat menggunakan format yang dimaksudkan untuk digunakan hanya untuk instans lokalDateTime. MDA ini tidak diaktifkan untuk instans yang tidak ditentukan atau default DateTime .

Gejala

Aplikasi secara manual menserialisasikan instans UTC DateTime menggunakan format lokal:

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

Penyebab

Format 'z' untuk DateTime.ToString metode ini mencakup offset zona waktu lokal, misalnya, "+10:00" untuk waktu Sydney. Dengan demikian, itu hanya akan menghasilkan hasil yang bermakna jika nilainya DateTime lokal. Jika nilainya adalah waktu UTC, DateTime.ToString menyertakan offset zona waktu lokal, tetapi tidak menampilkan atau menyesuaikan penentu zona waktu.

Resolution

Instans UTC DateTime harus diformat dengan cara yang menunjukkan bahwa instans tersebut adalah UTC. Format yang direkomendasikan untuk waktu UTC untuk menggunakan 'Z' untuk menunjukkan waktu UTC:

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

Ada juga format "o" yang menserialisasikan DateTime penggunaan Kind properti yang diserialisasikan dengan benar terlepas dari apakah instans bersifat lokal, UTC, atau tidak ditentukan:

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

Efek pada Runtime

MDA ini tidak memengaruhi runtime.

Hasil

Tidak ada output khusus sebagai akibat dari MDA ini mengaktifkan., Namun, tumpukan panggilan dapat digunakan untuk menentukan lokasi ToString panggilan yang mengaktifkan MDA.

Konfigurasi

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

Example

Pertimbangkan aplikasi yang secara tidak langsung menserialisasikan nilai UTC DateTime dengan menggunakan XmlConvert kelas atau DataSet , dengan cara berikut.

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

Serialisasi XmlConvert dan DataSet menggunakan format lokal untuk serialisasi secara default. Opsi tambahan diperlukan untuk menserialisasikan jenis DateTime nilai lain, seperti UTC.

Untuk contoh spesifik ini, teruskan XmlDateTimeSerializationMode.RoundtripKindToString ke panggilan di XmlConvert. Ini menserialisasikan data sebagai waktu UTC.

Jika menggunakan , atur DateTimeMode properti pada objek ke DataColumnUtc.DataSet

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

Baca juga