POSIX数字时区

时间:2017-01-12 03:04:04

标签: shell timezone posix

我可以像这样得到数字时区:

$ date +%z
-0600

但是我最近发现POSIX日期只支持打印 timezone name

$ date +%Z
CST

我可以坚持使用shell或其他工具获取数字版本 POSIX?

2 个答案:

答案 0 :(得分:0)

TZ variable由POSIX定义,因此我们可以遍历不同的时间 区域,直到找到匹配的区域:

chmod 777 path-to-your-directory

答案 1 :(得分:0)

Steven Penny's answer仅在您的时区与UTC之间没有变化的情况下才有效。它也省略了分钟,如果你在印度,这将无法工作。

要考虑到这一点,您需要更多日期信息:一年中的某一天和一小时后的分钟。

#!/bin/sh

T='+%j*1440+%H*60+%M' # minutes in year: DAY/Y * 1440 min/d + H * 60 h/min + MIN
Z=$(( ( $(date "$T") - ( $(date -u "$T") ) ) * 100 / 60 )) # TZ offset as hr*100

H=${Z%??} # hours ($Z is hundredths of hours, so we remove the last two digits)
if   [ $H -lt -13 ]; then H=$((H+8712))    # UTC is a year ahead
elif [ $H -gt  13 ]; then H=$((H%8736-24)) # UTC is a year behind
fi
if   [ $H -lt -13 ]; then H=$((H+24))      # UTC is a day ahead of a leap year
elif [ $H -gt  13 ]; then H=$((H-24))      # UTC is a day behind a leap year
fi

M=${Z#$H} # hundredths of hours (to become minutes on the next line)
if [ $M != 00 ]; then M=$(( $M * 60 / 100 )); fi # Minutes relative to 60/hr

printf '%+03d%02d' $H $M # TZ offset in HHMM

这可让您通过更改$TZ来更改时区,因此TZ=Asia/Calcutta myscript.sh应产生+0530的TZ偏移。 (此部分可能无法在较旧的POSIX系统上运行。)