Почему DateTime.Now и DateTime.UtcNow не являются моим текущим местным временем DateTime?

Мы используем DateTime.Now, но время не равно нашему серверному времени!

Когда я запускаю проект, это значения свойств DateTime:

DateTime.Now = {15/14/04 05:20:18 AM}
DateTime.UtcNow = {15/14/04 12:20:18 PM}

Но мое текущее местное системное время:

15/14/04 04:50:18 AM

Мой часовой пояс - Тегеран (UTC + 03: 30).

Это первый раз, когда я вижу это поведение! Почему DateTime.Now не равняется времени моего компьютера?

enter image description here

Ответы

Ответ 1

Убедитесь, что вы не управляете часовым поясом где-то в коде или играете с System.Globalization.CultureInfo
Попробуйте выполнить поиск во всем исходном коде System.Globalization.CultureInfo, возможно, это где-то, также может быть, часовой пояс кэширован где-то, поэтому попробуйте вызвать System.Globalization.CultureInfo.CurrentCulture.ClearCachedData() до DateTime.Now

.NET DateTime.Now возвращает неправильное время при изменении часового пояса

Ответ 2

Ваш часовой пояс - UTC +03: 30, но из-за перехода на летнее время +4: 30. Это означает, что когда DateTime.UtcNow = {15/14/04 12:20:18 PM}, оно 04:50:18 AM в вашем часовом поясе, которое подтверждают ваши часы.

Таким образом, ваш DateTime.Now не подтвердит ваши параметры даты и времени вашего компьютера, заставив его вернуть значение, не соответствующее вашим часам.

Из-за того, почему принятый ответ работает, можно объяснить DateTime.Now с помощью класса TimeZoneInfo для вычисления локального времени из UTC (с использованием часового пояса и летнего времени), но я не знаю, почему это может закончиться синхронизации. Вы никогда не перерабатываете пулы приложений и никогда не выключаете свою машину?;)

System.Globalization.CultureInfo.CurrentCulture.ClearCachedData() работает, потому что он вызывает TimeZone.ResetTimeZone() и TimeZoneInfo.ClearCachedData().