Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Примечание.
Эта статья относится к .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);