Bagikan melalui


dateTimeInvalidLocalFormat MDA

Catatan

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 instans DateTime yang disimpan sebagai Universal Coordinated Time (UTC) diformat menggunakan format yang dimaksudkan untuk digunakan hanya untuk instans DateTime lokal. MDA ini tidak diaktifkan untuk instans DateTime yang tidak ditentukan atau default .

Gejala

Aplikasi membuat serialisasi instans UTC DateTime secara manual menggunakan format lokal:

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

Penyebab

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

Resolusi

Instans UTC DateTime harus diformat dengan cara yang menunjukkan bahwa instans tersebut adalah UTC. Format yang disarankan untuk waktu UTC 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 penggunaan DateTime properti yang diserialisasikan Kind dengan benar terlepas dari apakah instans tersebut lokal, UTC, atau tidak ditentukan:

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

Efek pada Runtime

MDA ini tidak memengaruhi runtime bahasa umum.

Output

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

Konfigurasi

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

Contoh

Pertimbangkan aplikasi yang secara tidak langsung membuat serial nilai UTC DateTime dengan menggunakan kelas XmlConvert 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 membuat serialisasi jenis nilai DateTime lainnya, seperti UTC.

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

Jika menggunakan DataSet, atur properti DateTimeMode pada objek DataColumn ke Utc.

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

Lihat juga