web-dev-qa-db-ja.com

時間を正しく偽るには?

現在取り組んでいるソフトウェアプロジェクトの特定のタイムゾーン関連のバグを解決するために、timedatectlを使用してシステムのクロックの変更を複製し、ソフトウェアの動作を確認しようとしています。

私は実行することでそれを達成しようとしています

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

それを実行してtimedatectlrightを実行すると、予想される次の時間が得られます。

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秒後、分が(xx:59に)変わると、ローカル時刻と世界時の時刻が現在の時刻に「再起動」されます。

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

ここで何が欠けていますか?

私のセットアップはVagrant Ubuntu 18 VM(Linux vagrant 4.15.0-51/vm box "bento/ubuntu-18.04")です。

3
streppel

これは、表示されている動作を説明するものではありませんが、タイトルの質問に答えるはずです。

システムの時刻を変更する代わりに、 faketimeTZ環境変数などのツールを使用できます。

$ 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

これにより、システムの他の部分に影響を与えることなく、独自のタイムゾーン、日時でプログラムを実行できます。

$LD_PRELOADハックしてアプリケーションにコードを挿入します。静的にリンクされた実行可能ファイルやsetuid/setgid実行可能ファイルに対しては機能しません。

5
Stephen Kitt