タイムゾーンオフセットを整数に変換

タイムゾーンオフセットを整数に変換

時間帯計算をしていますbash。一部の追加計算では、タイムゾーンオフセット時間出力を整数に変換すると、予期しない値が表示されます。

スクリプトの一部:

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

出力

-0400
-256

目的の出力(誤って最終出力を100で割る必要性を省略しました)

-0400
-4

算術は8進数で評価されると思います。date +%z10進数の出力を評価する方法は?

答え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)

0がある理由は、bc1ドルがわからないからです+

時間別のタイムゾーンのみを処理する場合は、次のものを使用できます。

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

関連情報