시간대 계산을 하고 있어요 bash
. 일부 추가 계산을 위해 시간대 오프셋 시간 출력을 정수로 변환할 때 예상치 못한 값이 나타납니다.
스크립트의 일부:
offset=$(date +%z)
echo "$offset"
hours=$(( offset ))
echo "$hours"
산출
-0400
-256
원하는 출력(실수로 최종 출력을 100으로 나눌 필요성을 생략했습니다)
-0400
-4
산술은 8진수로 평가된다고 생각합니다. 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)
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) }'