我想检测我是在冬季还是夏季。我目前的做法是:
if date +%Z | grep -e CET -e EST; then
# I'm in winter time
else
# I'm in summer time
fi
这有明显的缺点,因为您必须知道所有时区名称。
Perl 的救援:
if perl -e 'exit ((localtime)[8])' ; then
echo winter
else
echo summer
fi
我现在不知道这是否能准确回答您的问题,但它为您提供了一些工具来帮助您更好地理解和测试正在发生的事情。
您可以使用date
和 environment-varTZ
来帮助您。
例如,我住在瑞典,所以我的时区位置是Europe/Stockholm。因此,在冬季date +%Z
报告 CET,在夏季报告 CEST。好处是您可以为特定命令的环境指定时区,然后您可以指定该date
命令应显示的日期。因此,通过总结这一点,您可以执行以下任何操作:
TZ=Europe/Stockholm date +%Z # CET or CEST depending of when its run
TZ=Europe/Stockholm date --date=20170101 +%Z # CET
TZ=Europe/Stockholm date --date=20170601 +%Z # CEST
TZ=CET date --date=20170101 +%Z # CET
TZ=CET date --date=20170601 +%Z # CEST, note that its auto adjusted to CEST
如果您想要与 UTC 的时差,您可以使用小写-z:
TZ=Europe/Stockholm date +%z # +0100 or +0200 depending of when its run
TZ=Europe/Stockholm date --date=20170101 +%z # +0100
TZ=Europe/Stockholm date --date=20170601 +%z # +0200
TZ=CET date --date=20170101 +%z # +0100
TZ=CET date --date=20170601 +%z # +0200
注意:您不能使用TZ=CEST
或者TZ=ULFR
因为那不是有效的 TZ:
TZ=CEST date --date=20170101 +%z # +0000
TZ=ULFR date --date=20170101 +%z # +0000
crontab 示例:
我们在 UTC 上运行我们的服务器,但 crontab 运行的一些作业需要在指定的挂钟 (CET/CEST) 时间运行。因此,由于我们希望作业在冬季后一小时运行(夏季时钟提前一小时女巫使其在夏季比冬季提前一小时到达指定的 UTC 时间),我们sleep
在实际工作在冬天执行。
我们希望每天/whatever/bin/foobar
在挂钟时间运行该作业。04:15
但由于 cron 在 UTC 上运行,因此 CET 需要提前一小时设置,CEST 需要提前两小时设置。这与总是提前两个小时运行命令但在冬季睡眠一个小时是一样的。前 crontab 行:
15 2 * * * [ `TZ=CET date +\%Z` = CET ] && sleep 3600; /whatever/bin/foobar
如果您对此问题有更好的解决方案,请随时建议我!
在北半球,在有夏令时的地区,当偏移量大于 1 月份的偏移量时,它就会处于活动状态。在南半球时区,当偏移量大于 7 月时,夏令时有效。
您可以在 1 月和 7 月以及现在发现偏移量:
OFF_1=$(date -d '1 Jan' +%z)
OFF_7=$(date -d '1 Jul' +%z)
OFF_NOW=$(date +%z)
如果您的区域没有夏令时,则所有三个都将相同(今年)。无论如何,我们可以做两个比较,一个是北半球,一个是南半球;如果当前偏移量大于其中任何一个,则当前区域处于夏令时:
if test $OFF_NOW -gt $OFF_1 || test $OFF_NOW -gt $OFF_7
then
# I'm in summer time
else
# I'm in winter time
fi
这里的假设是,所有遵守夏令时的地区都在 7 月和 1 月之间的某个地方过渡。据我所知,所有地区都是如此。唯一可能失败的情况是冬季偏移发生变化的一年(例如英国的 1940 年,当时的下一个冬季是 GMT+1)。
信息:
zdump -v Europe/Paris | grep 2020
给出了这个:
Europe/Paris Sun Mar 29 00:59:59 2020 UT = Sun Mar 29 01:59:59 2020 CET isdst=0 gmtoff=3600
Europe/Paris Sun Mar 29 01:00:00 2020 UT = Sun Mar 29 03:00:00 2020 CEST isdst=1 gmtoff=7200
Europe/Paris Sun Oct 25 00:59:59 2020 UT = Sun Oct 25 02:59:59 2020 CEST isdst=1 gmtoff=7200
Europe/Paris Sun Oct 25 01:00:00 2020 UT = Sun Oct 25 02:00:00 2020 CET isdst=0 gmtoff=3600