我想知道我是在冬天还是夏天.我目前的做法是:
if date +%Z | grep -e CET -e EST; then
# I'm in winter time
else
# I'm in summer time
fi
Run Code Online (Sandbox Code Playgroud)
这有明显的缺点,因为你必须知道所有的时区名称.
cho*_*oba 11
Perl救援:
if perl -e 'exit ((localtime)[8])' ; then
echo winter
else
echo summer
fi
Run Code Online (Sandbox Code Playgroud)
我现在不知道如果这完全回答了你的问题,但它为你提供了一些工具来帮助你更好地理解和测试最新情况.
您可以使用date
和environment-var TZ
来帮助您.
所以例如我住在瑞典所以我的时区位置是欧洲/斯德哥尔摩.所以在冬季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
Run Code Online (Sandbox Code Playgroud)
如果你想要与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
Run Code Online (Sandbox Code Playgroud)
注意:您不能使用TZ=CEST
或TZ=ULFR
因为那不是有效的TZ:
TZ=CEST date --date=20170101 +%z # +0000
TZ=ULFR date --date=20170101 +%z # +0000
Run Code Online (Sandbox Code Playgroud)
crontab示例:
我们在UTC上运行我们的服务器,但是crontab运行的一些作业需要在指定的wallclock(CET/CEST)时间运行.所以,因为我们希望工作在冬季一小时后运行(时钟向1小时着在夏季女巫使得它达到指定UTC时间比冬天夏天早1小时),我们做sleep
之前,实际工作在冬天执行.
我们希望这项工作每天都/whatever/bin/foobar
在04:15
挂钟时间运行.但是由于cron在UTC上运行,因此需要在CET提前一小时设置工作,在CEST提前两小时设置工作.这与两小时前总是运行命令相同,但在冬季时间睡了一个小时.Ex crontab行:
15 2 * * * [ `TZ=CET date +\%Z` = CET ] && sleep 3600; /whatever/bin/foobar
Run Code Online (Sandbox Code Playgroud)
如果您对此问题有更好的解决方案,请随时为我提供建议!
在北半球,在夏令时区域,当偏移量大于1月份的偏移量时,它就处于活动状态.在南半球时区,当偏移量大于7月时,夏令时活跃.
您可以在1月和7月以及现在发现偏移量:
OFF_1=$(date -d '1 Jan' +%z)
OFF_7=$(date -d '1 Jul' +%z)
OFF_NOW=$(date +%z)
Run Code Online (Sandbox Code Playgroud)
如果你的区域没有夏令时,那三个将是相同的(今年).无论如何,我们可以进行两次比较,一次是北半球,另一次是南半球; 如果当前偏移量大于其中任何一个,则当前区域处于夏令时:
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
Run Code Online (Sandbox Code Playgroud)
这里的假设是,所有观察夏令时的地区都会在7月到1月之间进行过渡.据我所知,在所有区域都是如此.唯一可能失败的情况是冬季抵消变化的一年(英国的1940年,当后的冬季是GMT + 1).