web-dev-qa-db-ja.com

Linux:存在しないタイムゾーンオフセットを設定しますか?

Linuxで、-12から+14の「有効な」範囲外のタイムゾーンオフセットを強制することは可能ですか?

実際にシステムクロックを変更せずに、可能であれば数日先の「現地時間」(テスト目的)を一時的にシミュレートする方法を探しています。

3
kbluck

存在しない任意のタイムゾーン名を使用して、時間を±24時間まで設定することができます。 MYFAKETIMEが有効なタイムゾーンとして存在しないと仮定すると(まだ存在していませんが、将来定義される可能性があります(非常にまれです))、次のことが可能です。

isaac@mail:~$ date
Sun Sep 30 01:22:05 EST 2018
isaac@mail:~$ TZ=MYFAKETIME date
Sun Sep 30 06:22:43 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+1 date
Sun Sep 30 05:22:56 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+10 date
Sat Sep 29 20:23:00 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+20 date
Sat Sep 29 10:23:05 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+24 date
Sat Sep 29 06:23:08 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+48 date
Sat Sep 29 06:23:14 MYFAKETIME 2018
isaac@mail:~$ TZ=MYFAKETIME+96 date
Sat Sep 29 06:23:25 MYFAKETIME 2018
isaac@mail:~$ 

24を超えるタイムゾーンは機能しないことに注意してください。それらは時間を変更しませんが、-24から+24の範囲に制限されます。 From 21.4.7 TZによるタイムゾーンの指定

最初の形式は、ローカルタイムゾーンに夏時間(または夏時間)がない場合に使用されます。

std offset

Std文字列は、タイムゾーンの名前を指定します。 3文字以上の長さである必要があり、先頭のコロン、埋め込み数字、コンマ、プラス記号およびマイナス記号を含めることはできません。タイムゾーン名とオフセットを区切るスペース文字はないため、仕様を正しく解析するには、これらの制限が必要です。

オフセットは、協定世界時の値を取得するために現地時間に追加する必要のある時間値を指定します。 [+ |-] hh [:mm [:ss]]のような構文があります。ローカルタイムゾーンが本初子午線の西側の場合は正、東側の場合は負になります。時間は0から24の間、分と秒は0から59の間でなければなりません。

したがって、TZ変数を使用して時間を「未来の日」に変更する方法はありません。

実際の解決策は、faketimeユーティリティを使用することです(同じ名前のパッケージから)。

それはあなたがすることを可能にするでしょう:

isaac@mail:~$ faketime '2008-12-24 08:15:42' /bin/date
Wed Dec 24 08:15:42 EST 2008
isaac@mail:~$ date
Sun Sep 30 01:44:29 EST 2018
3
Isaac

お探しのツールはfaketimeです。

faketime 'yesterday 9am' /bin/date
faketime '2018-10-25 16:45' /bin/date
4
roaima

TZ変数を設定するだけです。正の値は東に行くので、後ろ GMTもそうです。

例えば

$ TZ=GMT date
Sat Sep 29 19:12:30 GMT 2018
$ TZ=FAKEEAST+15 date
Sat Sep 29 04:12:36 FAKEEAST 2018
$ TZ=FAKEWEST-15 date
Sun Sep 30 10:12:41 FAKEWEST 2018

これにより、+ /-24時間しか移動できなくなります。

2
Stephen Harris