如何在 Bash 脚本中检查时区是否已改变?

如何在 Bash 脚本中检查时区是否已改变?

我有一个通过 crontab 运行的 shell 脚本,但其中的命令依赖于时区(它们每天刷新数据库中的表。如果脚本在 DST 更改期间运行,它将复制不一致的数据周期。

我计划使用一个包装脚本:

  1. 检查今天和明天的时区是否不同
  2. 仅当第一次检查返回 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 之间的偏移量的变化。它仍然是同一个时区。

相关内容