Поделиться через


dateTimeInvalidLocalFormat MDA

Помощник по отладке управляемого кода (MDA) dateTimeInvalidLocalFormat активируется в случае, когда экземпляр DateTime, который хранится в формате UTC, форматируется с применением формата, который должен использоваться только для экземпляров DateTime в локальном времени. Данный помощник по отладке управляемого кода не активируется для экземпляров DateTime, для которых не заданы дата и время, или экземпляров этого объекта по умолчанию.

Признаки

Приложение выполняет сериализацию экземпляра DateTime в формате UTC вручную с применением локального формата:

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

Причина

Формат "z" для метода DateTime.ToString включает смещение местного часового пояса, например "+10:00" для времени Сиднея. При этом результат применения данного формата будет значимым только в том случае, если значение DateTime является локальным. Если в качестве значения выступает время в формате UTC, метод DateTime.ToString включает смещение местного часового пояса, но не отображает и не регулирует спецификатор часового пояса.

Решение

Для форматирования экземпляров DateTime в формате UTC необходимо выбрать способ, указывающий на то, что данные экземпляры являются экземплярами UTC. Рекомендуется при форматировании времени UTC использовать "Z" для обозначения времени UTC:

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

Можно также использовать формат "o", который сериализует объект DateTime с помощью свойства Kind, правильно выполняющего сериализацию независимо от того, как указывается дата и время в экземпляре: в локальном времени, в формате UTC или они вовсе не заданы:

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

Влияние на среду выполнения

Данный помощник по отладке управляемого кода не оказывает влияния на среду выполнения.

Output

В результате активации данного помощника по отладке управляемого кода не возникает каких-либо особых выходных данных. Тем не менее, для определения местоположения вызова метода ToString, активирующего данный помощник по отладке управляемого кода, можно использовать стек вызовов.

Конфигурация

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

Пример

Можно использовать приложение, которое опосредованно выполняет сериализацию объекта DateTime в формате UTC, с помощью класса XmlConvert или DataSet.

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

Классы XmlConvert и DataSet используют локальные форматы для сериализации по умолчанию. Для сериализации других типов значений DateTime, например UTC, необходимы дополнительные параметры.

В данном конкретном примере при вызове метода ToString в классе XmlConvert передается значение XmlDateTimeSerializationMode.RoundtripKind. В результате выполняется сериализация значения времени в формате UTC.

При использовании метода DataSet следует присвоить свойству DateTimeMode объекта DataColumn значение Utc.

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

См. также

Ссылки

DateTimeFormatInfo

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке