![将时区偏移量转换为整数](https://linux22.com/image/130434/%E5%B0%86%E6%97%B6%E5%8C%BA%E5%81%8F%E7%A7%BB%E9%87%8F%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%95%B4%E6%95%B0.png)
我正在做一些时区计算bash
。将时区偏移小时输出转换为整数以进行一些额外的计算时,我得到了一些意外的值。
部分脚本:
offset=$(date +%z)
echo "$offset"
hours=$(( offset ))
echo "$hours"
输出
-0400
-256
期望的输出(我不小心省略了最终输出除以 100 的需要)
-0400
-4
我认为算术被评估为八进制。如何评估date +%z
十进制的输出?
答案1
答案2
使用sed
和bc
:
date +%z | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 + \3\/60)/' | bc
这将为您返回2.00
我所在的时区 ( +0200
)。
使用奇怪/不寻常的时区:
$ echo '+0245' | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 + \3\/60)/' | bc
2.75
$ echo '-0245' | sed -E 's/^([+-])(..)(..)/scale=2;0\1(\2 + \3\/60)/' | bc
-2.75
该sed
表达式会将时区变成“bc
脚本”。对于时区+HHMM
,脚本将是
scale=2;0+(HH + MM/60)
因为-HHMM
它将是
scale=2;0-(HH + MM/60)
零在那里是因为我bc
不理解一元+
。
如果您只打算处理整点时区,那么您可以使用
date +%z | sed -E 's/^([+-])(..)../0\1\2/' | bc
这将为您处理整数。
答案3
如果时区是整数小时(GNU 日期):
$ date +%-:::z
-4
否则(假设-0427):
$ date +%-:::z | awk -F: '{x=$1;printf("%s%.2f\n",x>=0?"+":"-",(x>=0?x:-x)+$2/60)}'
-4.45
或者,对于较旧的、更有限的日期实现,我们简单地说:
$ date +%z | awk -F '' '{printf("%s%.2f\n",$1,$2$3+($4$5)/60)}'
-4.45
这仍然不是 POSIX,因为 POSIX awk 未定义 null FS。
对于 POSIX,我们需要使用 sed 分割字符:
$ date +%z |\
sed -E 's/(.)(..)(..)/\1 \2 \3/' |\
awk '{ printf("%s%.2f\n",$1,$2+$3/60) }'