Udostępnij za pośrednictwem


dateTimeInvalidLocalFormat MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.

MdA dateTimeInvalidLocalFormat jest aktywowana, gdy DateTime wystąpienie przechowywane jako uniwersalny czas koordynowany (UTC) jest sformatowane przy użyciu formatu, który ma być używany tylko dla wystąpień lokalnych DateTime . Ta usługa MDA nie jest aktywowana dla nieokreślonych ani domyślnych DateTime wystąpień.

Objaw

Aplikacja ręcznie serializuje wystąpienie UTC DateTime przy użyciu formatu lokalnego:

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

Przyczyna

Format "z" dla DateTime.ToString metody obejmuje przesunięcie lokalnej strefy czasowej, na przykład "+10:00" dla czasu Sydney. W związku z tym spowoduje to wygenerowanie znaczącego wyniku tylko wtedy, gdy wartość parametru DateTime jest lokalna. Jeśli wartość to czas UTC, zawiera przesunięcie lokalnej strefy czasowej, DateTime.ToString ale nie wyświetla ani nie dostosowuje specyfikatora strefy czasowej.

Rozwiązanie

Wystąpienia UTC DateTime powinny być sformatowane w sposób wskazujący, że są to wystąpienia UTC. Zalecany format czasu UTC do używania "Z" do oznaczania czasu UTC:

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

Istnieje również format "o", który serializuje użycie Kind właściwości, która serializuje DateTime poprawnie, niezależnie od tego, czy wystąpienie jest lokalne, UTC, czy nieokreślone:

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

Wpływ na środowisko uruchomieniowe

Ta usługa MDA nie ma wpływu na środowisko uruchomieniowe.

Wyjście

W wyniku aktywowania mdA nie ma żadnych specjalnych danych wyjściowych. Jednak stos wywołań może służyć do określenia lokalizacji ToString wywołania, które aktywowało mdA.

Konfigurowanie

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

Przykład

Rozważmy aplikację, która pośrednio serializuje wartość UTC DateTime przy użyciu XmlConvert klasy lub DataSet w następujący sposób.

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

Serializacja XmlConvert i DataSet domyślnie używa formatów lokalnych do serializacji. Dodatkowe opcje są wymagane do serializacji innych rodzajów DateTime wartości, takich jak UTC.

W tym konkretnym przykładzie przekaż polecenie XmlDateTimeSerializationMode.RoundtripKind do wywołania ToString polecenia XmlConvert. Spowoduje to serializację danych jako czas UTC.

W przypadku używania DataSetobiektu ustaw DateTimeMode właściwość na DataColumnUtcwartość .

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

Zobacz też