dateTimeInvalidLocalFormat MDA
Примечание.
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник по отладке управляемого кода 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 включает сдвиг местного часового пояса, например "+03:00" для московского времени. Таким образом, значащий результат будет получен только в том случае, если экземпляр DateTime содержит значение местного времени. Если время указано в формате UTC, DateTime.ToString содержит сдвиг местного часового пояса, однако не отображает и не позволяет изменять описатель часового пояса.
Разрешение
Экземпляры DateTime в формате UTC должны иметь форматирование, явно указывающее на это. Для работы со временем в формате UTC рекомендуется использовать формат "Z":
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"));
Влияние на среду выполнения
Этот помощник по отладке управляемого кода не влияет на среду выполнения.
Выходные данные
В результате его активации не возвращаются какие-либо конкретные выходные данные. Тем не менее с помощью стека вызовов можно определить расположение вызова ToString, который стал причиной активации этого помощника.
Настройка
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Пример
Рассмотрите возможность косвенной сериализации значений DateTime в формате UTC с использованием класса XmlConvert или DataSet, как показано ниже.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
В сериализациях XmlConvert и DataSet по умолчанию используется локальный формат. Для сериализации значений DateTime другого вида, например в формате UTC, требуется указать дополнительные параметры.
Конкретно в этом примере необходимо передать XmlDateTimeSerializationMode.RoundtripKind
в вызов ToString
для XmlConvert
. В этом случае данные сериализуются как время в формате UTC.
При использовании DataSet присвойте свойству DateTimeMode объекта DataColumn значение Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);