Um einen bestimmten zeitzonenbezogenen Fehler in einem Softwareprojekt zu beheben, an dem ich arbeite, versuche ich, eine Änderung auf dem System zu replizieren. s Uhr mit timedatectl
, um mein Softwareverhalten zu überprüfen.
Ich versuche dies zu erreichen, indem ich
timedatectl set-timezone America/New_York timedatectl set-local-rtc 1 timedatectl set-ntp false timedatectl set-time "2017-03-12 01:58:50" && hwclock -w
Wenn ich das mache und timedatectl
direkt danach ausführe, erhalte ich die erwartete folgende Zeit:
Local time: Sun 2017-03-12 01:58:51 EST Universal time: Sun 2017-03-12 06:58:51 UTC RTC time: Sun 2017-03-12 01:58:51 Time zone: America/New_York (EST, -0500) System clock synchronized: no systemd-timesyncd.service active: no RTC in local TZ: yes
10 Sekunden später, wenn sich die Minute ändert (auf xx:59
), wird die lokale und universelle Zeit auf die aktuelle Zeit „neu gestartet“
Local time: Wed 2019-08-07 21:01:41 EDT Universal time: Thu 2019-08-08 01:01:41 UTC RTC time: Sun 2017-03-12 01:58:57 Time zone: America/New_York (EDT, -0400) System clock synchronized: no systemd-timesyncd.service active: no RTC in local TZ: yes
Was fehlt mir hier?
Mein Setup ist eine Vagrant Ubuntu 18-VM (Linux vagrant 4.15.0-51 / vm-Box „bento / ubuntu-18.04“).
Kommentare
- Möglicherweise stellen Sie fest, dass Ihre VM-Zeit mit der Zeit Ihres Hosts ' synchronisiert ist. Nicht vertraut mit Vagrant, daher kann ' Sie nicht auf eine Lösung hinweisen.
Antwort
Dies erklärt nicht das Verhalten, das Sie sehen, aber es sollte die Frage im Titel beantworten.
Anstatt die Systemzeit zu ändern, können Sie ein Tool wie faketime
und die Umgebungsvariable TZ
:
$ date; faketime -f -15d date; TZ=America/New_York faketime -f -15d date Thu 8 Aug 10:21:13 CEST 2019 Wed 24 Jul 10:21:13 CEST 2019 Wed 24 Jul 04:21:13 EDT 2019
Auf diese Weise können Sie Ihr Programm mit einer eigenen Zeitzone, einem eigenen Datum und einer eigenen Uhrzeit ausführen, ohne den Rest des Systems zu beeinflussen.
Beachten Sie dies verwendet einen $LD_PRELOAD
-Hack, um Code in Anwendungen einzufügen. Er funktioniert nicht für statisch verknüpfte ausführbare Dateien oder ausführbare Dateien von setuid / setgid.