111--- Asked: 2018-03-29 08:45:32 +0800 CST2018-03-29 08:45:32 +0800 CST 2018-03-29 08:45:32 +0800 CST 将时区偏移量转换为整数 772 我正在做一些时区计算bash。将时区偏移小时输出转换为整数以进行一些额外计算时,我得到了一些意外的值。 部分脚本: offset=$(date +%z) echo "$offset" hours=$(( offset )) echo "$hours" 输出 -0400 -256 期望的输出(我不小心忽略了最终输出除以 100 的需要) -0400 -4 我认为算术被评估为八进制。如何评估date +%z十进制的输出? bash date 3 个回答 Voted NOLFXceptMe 2018-03-29T09:14:26+08:002018-03-29T09:14:26+08:00 offset=$(date +%-z)-400在你的情况下会给出一个输出。 -在%符号删除零填充之后。 [1] 相关答案 Best Answer Kusalananda 2018-03-29T09:45:33+08:002018-03-29T09:45:33+08:00 使用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不明白 unary +。 如果您只处理全小时时区,那么您可以使用 date +%z | sed -E 's/^([+-])(..)../0\1\2/' | bc 这将处理你的整数。 user232326 2018-03-29T17:33:51+08:002018-03-29T17:33:51+08:00 如果时区是整数小时(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 未定义空 FS。 对于 POSIX,我们需要用 sed 分割字符: $ date +%z |\ sed -E 's/(.)(..)(..)/\1 \2 \3/' |\ awk '{ printf("%s%.2f\n",$1,$2+$3/60) }'
offset=$(date +%-z)
-400
在你的情况下会给出一个输出。-
在%
符号删除零填充之后。[1] 相关答案
使用
sed
和bc
:这将使您
2.00
回到我所在的时区 (+0200
)。使用奇怪/不寻常的时区:
该
sed
表达式会将时区转换为“bc
脚本”。对于时区+HHMM
,脚本将是因为
-HHMM
它将是零在那里是因为我
bc
不明白 unary+
。如果您只处理全小时时区,那么您可以使用
这将处理你的整数。
如果时区是整数小时(GNU 日期):
否则(假设 -0427):
或者,对于较旧的、更有限的日期实现,我们很简单:
这仍然不是 POSIX,因为 POSIX awk 未定义空 FS。
对于 POSIX,我们需要用 sed 分割字符: