前导零是导致数字被解释为八进制的原因。引用自man bash
:
算术评估
[...]
以 0 开头的常量被解释为八进制数。前导 0x 或 0X 表示十六进制。否则,数字采用 [base#]n 形式,其中可选的基数是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字。如果省略 base#,则使用基数 10。
date
将命令的格式字符串更改为%k
或%_H
去掉前导零:
#!/bin/bash
gmthour=$(date -u +%k)
localhour=$(date +%k)
echo $gmthour
echo $localhour
tz=$(( gmthour - localhour ))
echo $tz
请注意,当日期发生变化时,您的计算会中断。例子:
$ date
Di 2. Jul 00:50:29 CEST 2013
$ gmthour=$(date -u +%k)
$ localhour=$(date +%k)
$ echo $gmthour
22
$ echo $localhour
0
$ echo $((gmthour - localhour))
22
CEST 显然不是 UTC+22。
试试这个:
#!/bin/bash
gmthour=$(date -u +%k)
localhour=$(date +%k)
echo $gmthour
echo $localhour
if [ $(date +%w) -eq $(date -u +%w) ]; then
tz=$(( gmthour - localhour ))
else
tz=$(( 24 - gmthour + localhour ))
fi
echo $tz