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 мой эксперимент показывает, что если я перезапущу приложение, он покажет новый часовой пояс, но "старое" время. Новое время будет восстановлено после перезапуска системы.
Ответы
Ответ 1
Вы можете проверить ссылку msdn . В нем четко указано следующее:
Примечания к вызывающим абонентам: данные локального часового пояса кэшируются после CurrentTimeZone сначала используется для получения информации о часовом поясе. Если система локальная часовой пояс впоследствии изменяется, свойство CurrentTimeZone не отражают это изменение. Если вам необходимо обрабатывать изменения часовых поясов, пока ваше приложение запущено, используйте класс TimeZoneInfo и вызывайте его Метод TimeZoneInfo.ClearCachedData.
это документально зафиксировано где-нибудь?
Да, как указано выше.
Почему не происходит изменение часового пояса во время работы приложения?
Поскольку информация о часовом поясе кэшируется.
Могу ли я сделать что-нибудь, чтобы приложение забирало изменения часового пояса во время его работы?
Да, используя класс TimeZoneInfo и вызывая его метод TimeZoneInfo.ClearCachedData.