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


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);

См. также