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);
См. также
Ссылки
Основные понятия
Диагностика ошибок посредством управляемых помощников по отладке