2017-07-04 32 views
25

Wyobraźmy sobie, że ten mały program działa:DateTime.Now vs czasu systemowego

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

Kiedy zmienić strefę czasową systemu, gdy program jest uruchomiony app nie widzi zmian. Strefa czasowa i czas są takie, jakby strefa czasowa się nie zmieniła.

Aby aplikacja wyświetlała nową strefę czasową i czasową, muszę ponownie uruchomić aplikację.

Jeśli zmienię czas systemowy, zmiana czasu jest natychmiast pobierana.

Byłoby wspaniale, gdyby mógł mi pomóc z trzech pytań:

  • jest to udokumentowane w dowolnym miejscu?
  • dlaczego zmiana strefy czasowej nie została zmieniona podczas działania aplikacji?
  • Czy mogę zrobić wszystko, aby aplikacja zmieniała ustawienia strefy czasowej, gdy jest uruchomiona?

Oto mały zrzut ekranu, aby pokazać aplikację .NET przy użyciu czas inny niż system operacyjny: .NET App out of sync with system time.

BTW. W systemie Windows IOT na Raspberry Pi mój eksperyment pokazuje, że po ponownym uruchomieniu aplikacji pojawi się nowa strefa czasowa, ale "stary" czas. Nowy czas zostanie odebrany po ponownym uruchomieniu systemu.

Odpowiedz

40

Możesz sprawdzić następujące msdn link. Wyraźnie stwierdza co następuje:

Notes Dzwoniący: Lokalne dane strefa czasowa jest buforowane po CurrentTimeZone jest po raz pierwszy użyty w celu pobrania informacji o strefie czasowej. Jeśli lokalna strefa czasowa systemu zmieni się później, właściwość CurrentTimeZone nie będzie odzwierciedlać tej zmiany od . Jeśli chcesz obsłużyć zmiany strefy czasowej, gdy aplikacja jest uruchomiona, użyj klasy TimeZoneInfo i wywołaj jej metodę TimeZoneInfo.ClearCachedData ( ).

jest to dokumentacja w dowolnym miejscu? Tak, jak stwierdzono powyżej.

dlaczego zmiana strefy czasowej nie została zmieniona podczas działania aplikacji? Ponieważ informacje o strefie czasowej są przechowywane w pamięci podręcznej.

Czy mogę zrobić wszystko, aby aplikacja zmieniała ustawienia strefy czasowej, gdy jest uruchomiona? Tak, używając klasy TimeZoneInfo i wywołując jej metodę TimeZoneInfo.ClearCachedData.

+1

Czy wiesz również, jak osiągnąć to, co TimeZoneInfo.ClearCachedData robi w Universal Windows? Ta metoda nie jest dostępna. – mayu

+1

W systemie Universal Windows musisz wywołać tę metodę za pomocą Reflection (i przetestować, czy działa na twoim urządzeniu) - została ona wykonana jako prywatna – mayu