2017-07-04 1 views
25

Stellen wir uns vor, dass dieses kleine Programm läuft:DateTime.Now vs Systemzeit

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

Wenn ich die Systemzeitzone zu ändern, wenn das Programm die App läuft nicht um die Änderung zu sehen. Die Zeitzone und die Zeit sind so, als hätte sich die Zeitzone nicht geändert.

Damit die App die neue Zeit und Zeitzone anzeigt, muss ich die App neu starten.

Wenn ich die Systemzeit ändere, wird die Zeitänderung sofort übernommen.

Es wäre toll, wenn Sie mich mit drei Fragen helfen könnte:

  • ist dies überall dokumentiert?
  • Warum wird die Zeitzonenänderung nicht während der Ausführung der Anwendung aufgehoben?
  • kann ich alles tun, damit die App Änderungen der Zeitzone während der Ausführung erkennt?

Hier ist eine kleine Screenshot .NET app Zeit anders als das Betriebssystem zu zeigen: .NET App out of sync with system time.

BTW. Unter Windows IOT auf Raspberry Pi zeigt mein Experiment, dass wenn ich die App neu starte, es die neue Zeitzone anzeigt, aber die 'alte' Zeit. Die neue Uhrzeit wird nach dem Neustart des Systems übernommen.

Antwort

40

Sie können die folgenden msdn link überprüfen. Darin heißt es eindeutig die folgenden:

Hinweise zu Aufrufern: Lokale Zeitzone Daten zwischengespeichert wird nach Current ersten Zeitzoneninformationen verwendet wird, abgerufen werden. Wenn sich die lokale Zeitzone des Systems später ändert, spiegelt die CurrentTimeZone-Eigenschaft diese Änderung nicht wider. Wenn Sie Zeitzonenänderungen verarbeiten müssen, während die Anwendung ausgeführt wird, verwenden Sie die Klasse TimeZoneInfo und rufen Sie die Methode TimeZoneInfo.ClearCachedData auf.

ist dies überall dokumentiert? Ja, wie oben erwähnt.

Warum wird die Zeitzonenänderung während der Ausführung der Anwendung nicht aufgehoben? Da die Zeitzone Informationen zwischengespeichert werden.

kann ich alles tun, damit die App die Zeitzone ändert, während sie läuft? Ja, indem Sie die TimeZoneInfo-Klasse verwenden und ihre TimeZoneInfo.ClearCachedData-Methode aufrufen.

+1

Wissen Sie auch, wie Sie erreichen, was TimeZoneInfo.ClearCachedData in Universal Windows macht? Die Methode ist nicht verfügbar. – mayu

+1

In Universal Windows müssen Sie diese Methode über Reflection aufrufen (und testen Sie es auf Ihrem Gerät funktioniert) - es wurde privat gemacht – mayu