Bash脚本如何判断EST时区含端点的00:00-01:00时间区间
问题根因与解决方案
原有脚本存在两个核心问题,导致无法满足需求:
- 未指定时区:直接通过
date获取的是服务器本地时间,并非要求的美国东部时间,即使比较逻辑正确,时区偏差也会导致判断失效 - 比较逻辑使用错误:如果在单括号
[ ]的判断中写>=、<=运算符,shell会将其解析为重定向指令而非比较规则,完全达不到预期效果
正确实现方案
方案1:数值比较(最稳妥,推荐)
将时分转换为当天0点起的总分钟数,通过数值区间判断,避免字符串比较、转义等坑:
# 1. 指定时区获取美国东部时间的时分 # 如果需要固定使用标准EST(UTC-5,不切换夏令时),把TZ值改成EST5即可 est_time_str=$(TZ=America/New_York date +%H:%M) # 2. 拆分时分,转成从0点开始的总分钟数 est_hour=${est_time_str%%:*} est_minute=${est_time_str##*:} # 加10#强制把带前导0的数字转成十进制,避免bash八进制解析报错 est_total_min=$((10#$est_hour * 60 + 10#$est_minute)) # 3. 含端点判断:00:00对应总分钟数0,01:00对应总分钟数60 if [[ $est_total_min -ge 0 && $est_total_min -le 60 ]]; then ./mailscript1.sh else ./mailscript2.sh fi
方案2:字符串比较(写法正确即可生效)
如果不想拆分转数值,只要用双括号[[ ]]做比较即可,双括号原生支持>=、<=字符串比较运算符,不需要转义:
est_time_str=$(TZ=America/New_York date +%H:%M) # 因为date +%H:%M输出固定为两位小时、两位分钟,字典序和实际时间顺序一致 if [[ "$est_time_str" >= "00:00" && "$est_time_str" <= "01:00" ]]; then ./mailscript1.sh else ./mailscript2.sh fi
关键注意事项
- 一定要通过
TZ=时区值的方式临时指定时区,不要修改全局时区配置,避免影响服务器其他业务 - 做数值转换时必须给小时、分钟加
10#前缀,否则带前导0的数值(比如08、09)会被bash默认当成八进制数解析,导致计算报错 - 不要在单括号
[ ]中使用>=、<=,单括号属于POSIX test标准,不支持这类运算符,写上去会被当成重定向执行,逻辑完全错误 - 美国东部时间对应的常规时区标识为
America/New_York,会自动适配夏令时切换;如果需要固定使用冬令时的标准EST(UTC-5),可以替换为EST5
内容的提问来源于stack exchange,提问作者rohit shinde
相关产品推荐
相关产品推荐

