将时区偏移量转换为整数

将时区偏移量转换为整数

我正在做一些时区计算bash。将时区偏移小时输出转换为整数以进行一些额外的计算时,我得到了一些意外的值。

部分脚本:

offset=$(date +%z)
echo "$offset"
hours=$(( offset ))
echo "$hours"

输出

-0400
-256

期望的输出(我不小心省略了最终输出除以 100 的需要)

-0400
-4

我认为算术被评估为八进制。如何评估date +%z十进制的输出?

答案1

offset=$(date +%-z)-400在你的情况下会给出输出。

-%符号删除零填充后。

[1] 相关回答

答案2

使用sedbc

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) }'

相关内容