在bash中检测夏令时

时间:2013-11-11 08:31:44

标签: bash date dst

我想知道我是在冬天还是夏天。我目前的做法是:

if date +%Z | grep -e CET -e EST; then
  # I'm in winter time
else
  # I'm in summer time
fi

有明显的缺点,因为你必须知道所有的时区名称。

4 个答案:

答案 0 :(得分:10)

Perl救援:

if perl -e 'exit ((localtime)[8])' ; then
    echo winter
else
    echo summer
fi

答案 1 :(得分:6)

如果这完全回答了你的问题,我现在不会这样做,但它会为你提供一些工具来帮助你更好地理解和测试最新情况。

您可以使用date和environment-var TZ来帮助您。

所以例如我住在瑞典所以我的时区位置是 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的时差,可以使用lowercase-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=CESTTZ=ULFR,因为这不是有效的TZ:

TZ=CEST date --date=20170101 +%z # +0000
TZ=ULFR date --date=20170101 +%z # +0000

crontab示例:

我们在UTC上运行我们的服务器,但是crontab运行的一些作业需要在指定的wallclock(CET / CEST)时间运行。所以,因为我们希望工作在冬天一个小时后运行(夏天时钟向前一小时,使得它在夏天提前一小时达到指定的UTC时间,而不是冬天){{ 1}}在冬天执行实际工作之前。

我们希望作业sleep每天在/whatever/bin/foobar挂钟时间运行。但是由于cron在UTC上运行,因此需要在CET提前一小时设置工作,在CEST提前两小时设置工作。这与两小时前总是运行命令相同,但在冬季时间睡了一个小时。 Ex crontab行:

04:15

如果您对此问题有更好的解决方案,请随时为我提供建议!

答案 2 :(得分:6)

在北半球,在夏令时区域,当偏移量大于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

这里假设所有观察夏令时的地区都会在七月到一月之间的某个地方过渡。据我所知,在所有区域都是如此。唯一可能失败的情况是冬季抵消变化的一年(英国的1940年,随后的冬季是GMT + 1)。

答案 3 :(得分: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