时区更改时在运行时请求新的系统时间

Request New System Time on Runtime when Timezone Changes

我有一个 windows 服务,它在本地系统时区发生变化时监视系统事件,然后执行事件查询新时区和新系统时间。我关注了 [Microsoft documentation][1] 但在时区更改后我无法使用 DateTime.Now.ToLongTimeString() 获取新的系统时间。我该如何解决这个问题?

Debugging TimeZone.CurrentTimeZone

我还发现 TimeZone.CurrentTimezone 不会更新标准时区,而只会在系统上更改时区后更新 DaylightName。 Logs when TimeZone Changes

理想情况下,我不仅希望获得新的系统时间,还希望获得时区标准名称。但是有了新的系统时间和日光名称,我可以实现我的应用程序的其余部分。

查看下面我的代码:

 //when service starts
    public void Start()
    {

        //timer stops
        _timer.Start();

        //Event when services Starts
        ServiceStarted();

        //Getting access to the System Events, and monitoring for time Zone changes.
        SystemEvents.TimeChanged += SystemEvents_TimeChanged;


    }

    //System Time event when Time Changes
    private void SystemEvents_TimeChanged(object sender, EventArgs e)

    {
        TimeZoneInfo.Local.ToString();
        TimeZone.CurrentTimeZone.ToString();

                    string[] lines = new string[]
        {
            $"{DateTime.Now.ToString()} The Local System Time has changed",
            $"{DateTime.Now.ToString()} Previous Time zone {TimeZoneInfo.Local.DaylightName.ToString()}",
            $"{DateTime.Now.ToString()} New Time Zone {TimeZone.CurrentTimeZone.DaylightName.ToString()} and the time is {DateTime.Now.ToLongTimeString()}"


        };

        //create log file and add the event message
        File.AppendAllLines(@"C:\Temp\Heartbeat_Log.txt", lines);
    }

.Net 出于性能原因缓存系统本地时区,因此如果您专门监视更改,则需要清除缓存。

在您的事件处理程序中,调用:

TimeZoneInfo.ClearCachedData();

https://docs.microsoft.com/dotnet/api/system.timezoneinfo.clearcacheddata

此外,TimeZone class 已弃用。仅使用 TimeZoneInfo.