시간대 오프셋을 정수로 변환

시간대 오프셋을 정수로 변환

시간대 계산을 하고 있어요 bash. 일부 추가 계산을 위해 시간대 오프셋 시간 출력을 정수로 변환할 때 예상치 못한 값이 나타납니다.

스크립트의 일부:

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

산출

-0400
-256

원하는 출력(실수로 최종 출력을 100으로 나눌 필요성을 생략했습니다)

-0400
-4

산술은 8진수로 평가된다고 생각합니다. 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)

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

관련 정보