dateTimeInvalidLocalFormat MDA

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 . To rozwiązanie MDA nie jest aktywowane 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, aby użyć "Z", aby oznaczyć czas UTC:

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

Istnieje również format "o", który serializuje DateTime użycie Kind właściwości, która serializuje 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

To rozwiązanie MDA nie ma wpływu na środowisko uruchomieniowe.

Dane wyjściowe

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 uaktywniło mdA.

Konfigurowanie

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

Przykład

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

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

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

W tym konkretnym przykładzie przekaż XmlDateTimeSerializationMode.RoundtripKind do wywołania ToString polecenia XmlConvert. Spowoduje to serializacji danych jako godziny UTC.

Jeśli używasz elementu DataSet, ustaw DateTimeMode właściwość obiektu na DataColumnUtcwartość .

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

Zobacz też