是否可以在任何 Linux 上强制设置超出“有效”范围 -12 到 +14 的时区偏移量?
我正在寻找一种方法来临时模拟可能是未来几天的“本地时间”(用于测试目的),如果可能的话,而不实际更改系统时钟。
答案1
可以使用任何不存在的时区名称并将时间设置为 +- 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
。从21.4.7 用 TZ 指定时区
当当地时区没有夏令时(或夏令时)时,使用第一种格式:
std offset
std 字符串指定时区的名称。一定是三个或更多字符很长,不得包含前导冒号、嵌入数字、逗号、加号和减号。时区名称与偏移量之间没有空格字符分隔,因此这些限制对于正确解析规范是必要的。
偏移量指定必须添加到本地时间才能获得协调世界时值的时间值。它的语法类似于 [+|-]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
答案2
只需设置TZ
变量即可。积极的价值观走向东方,也是如此在后面格林威治标准时间。
例如
$ 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 小时。
答案3
您正在寻找的工具是faketime
.
faketime 'yesterday 9am' /bin/date
faketime '2018-10-25 16:45' /bin/date