我有一个通过 crontab 运行的 shell 脚本,但其中的命令依赖于时区(它们每天刷新数据库中的表。如果脚本在 DST 更改期间运行,它将复制不一致的数据周期。
我计划使用一个包装脚本:
- 检查今天和明天的时区是否不同
- 仅当第一次检查返回 false 时才运行子脚本(没有什么不同)
关于更改时区有很多信息,但没有关于检查 linux/bash 中时区是否更改的信息。
答案1
以下测试当地时区自昨天以来是否发生了变化:
[ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ]
该%z
格式要求日期返回时区。以上将今天的结果与昨天的结果进行比较。
如何使用它
测试命令可用于控制语句的执行:
$ [ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ] && echo "No change"
No change
或者,
$ if [ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ]; then echo "No change"; fi
No change
怎么运行的
该格式的输出%z
如下所示:
$ date '+%z'
-0800
$ date -d yesterday '+%z'
-0800
以上表示比格林威治标准时间晚 8 小时。该时间差取决于我们处于夏令时还是标准时间。例如:
$ date -d "nov 1, 2014" '+%z'
-0700
[
表示 bash 的text
命令。以下命令将今天的结果与昨天的结果进行比较:
[ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ]
答案2
需要澄清的一点是:date -d yesterday +%z
假设系统设置为昨天的时区,它会告诉您昨天是否会报告与今天相同的时间。它不会告诉您是否有人用不同的默认系统范围时区替换了 /etc/localtime。
严格来说,夏令时并不是时区的变化,它只是时区与 UTC 之间的偏移量的变化。它仍然是同一个时区。