2017-07-04 83 views
25

讓我們想象一下,這個小程序運行:DateTime.Now VS系統時間

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

當我更改了系統的時區在程序運行的應用程序沒有看到改變的時候。時區和時間就好像時區沒有改變。

爲了讓應用程序顯示新的時間和時區,我需要重新啓動應用程序。

如果我更改系統時間,則立即收回時間更改。

這將是巨大的,如果你能幫助我的三個問題:

  • 是這個記錄任何地方?
  • 爲什麼在應用程序運行時沒有選擇時區更改?
  • 我可以做任何事情,讓應用程序在運行時選擇時區更改嗎?

這裏有一個小屏幕截圖的使用時間比操作系統不同,顯示.NET應用程序: .NET App out of sync with system time.

BTW。在Raspberry Pi上的Windows IOT上,我的實驗顯示,如果我重新啓動應用程序,它將顯示新的時區,但顯示「舊」時間。重新啓動系統後,新時間將會啓動。

回答

40

您可以查看以下msdn link。它明確規定了以下內容:

註釋來電者:後CurrentTimeZone 首先用於檢索時區信息本地時區是緩存數據。如果系統的本地 時區隨後發生更改,則CurrentTimeZone屬性不會反映此更改, 。如果您需要處理時區更改,而您的應用程序正在運行 ,請使用TimeZoneInfo類並調用其 TimeZoneInfo.ClearCachedData方法。

這是否記錄在任何地方? 是的,如上所述。

爲什麼在應用程序運行時沒有找到時區更改? 因爲時區信息被緩存。

我可以做任何事情讓應用程序在運行時選擇時區更改嗎? 是的,通過使用TimeZoneInfo類並調用它的TimeZoneInfo.ClearCachedData方法。

+1

你還知道如何實現TimeZoneInfo.ClearCachedData在通用Windows中的功能嗎?該方法不可用。 – mayu

+1

在通用Windows中,您需要通過反射調用此方法(並測試它在您的設備上工作) - 它已被製作爲私有 – mayu