時間帯計算をしていますbash
。一部の追加計算では、タイムゾーンオフセット時間出力を整数に変換すると、予期しない値が表示されます。
スクリプトの一部:
offset=$(date +%z)
echo "$offset"
hours=$(( offset ))
echo "$hours"
出力
-0400
-256
目的の出力(誤って最終出力を100で割る必要性を省略しました)
-0400
-4
算術は8進数で評価されると思います。date +%z
10進数の出力を評価する方法は?
答え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)
0がある理由は、bc
1ドルがわからないからです+
。
時間別のタイムゾーンのみを処理する場合は、次のものを使用できます。
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 awkはnull FSを定義しないため、これはまだPOSIXではありません。
POSIXの場合、文字を分割するにはsedを使用する必要があります。
$ date +%z |\
sed -E 's/(.)(..)(..)/\1 \2 \3/' |\
awk '{ printf("%s%.2f\n",$1,$2+$3/60) }'