Подтвердить что ты не робот

DateTime.Now против системного времени

Предположим, что эта небольшая программа работает:

while (true)
{
    Console.WriteLine($"{DateTime.UtcNow} -> {DateTime.Now} tz={TimeZone.CurrentTimeZone.StandardName} / {TimeZoneInfo.Local.StandardName}");
    await Task.Delay(TimeSpan.FromSeconds(1));
}

Когда я меняю системный часовой пояс, когда программа запускается, приложение не видит изменения. Часовой пояс и время как будто часовой пояс не изменился.

Чтобы приложение отображало новое время и часовой пояс, мне нужно перезапустить приложение.

Если я изменил системное время, время изменения сразу же подбирается.

Было бы здорово, если бы вы могли помочь мне с тремя вопросами:

  • Этот документ документирован где угодно?
  • Почему не происходит изменение часового пояса во время работы приложения?
  • Могу ли я сделать что-нибудь, чтобы приложение забирало изменения в часовом поясе во время работы?

Вот небольшой скриншот, показывающий приложение .NET с использованием времени, отличного от операционной системы: .NET App не синхронизируется с системным временем.

BTW. В Windows IOT на Raspberry Pi мой эксперимент показывает, что если я перезапущу приложение, он покажет новый часовой пояс, но "старое" время. Новое время будет восстановлено после перезапуска системы.

4b9b3361

Ответ 1

Вы можете проверить ссылку msdn . В нем четко указано следующее:

Примечания к вызывающим абонентам: данные локального часового пояса кэшируются после CurrentTimeZone сначала используется для получения информации о часовом поясе. Если система локальная часовой пояс впоследствии изменяется, свойство CurrentTimeZone не отражают это изменение. Если вам необходимо обрабатывать изменения часовых поясов, пока ваше приложение запущено, используйте класс TimeZoneInfo и вызывайте его Метод TimeZoneInfo.ClearCachedData.

это документально зафиксировано где-нибудь? Да, как указано выше.

Почему не происходит изменение часового пояса во время работы приложения? Поскольку информация о часовом поясе кэшируется.

Могу ли я сделать что-нибудь, чтобы приложение забирало изменения часового пояса во время его работы? Да, используя класс TimeZoneInfo и вызывая его метод TimeZoneInfo.ClearCachedData.