Converter deslocamento do fuso horário em número inteiro

0

Estou fazendo alguns cálculos de fuso horário em bash . Estou recebendo alguns valores inesperados ao converter a saída da hora de deslocamento do fuso horário em um inteiro para fazer alguns cálculos adicionais.

Script parcial:

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

Saída

-0400
-256

Saída desejada (acidentalmente omiti a necessidade de dividir por 100 para a saída final)

-0400
-4

Eu acho que a aritmética está sendo avaliada como octal. Como posso avaliar a saída de date +%z como decimal?

    
por datUser 28.03.2018 / 18:45

3 respostas

1

Usando sed e bc :

date +%z | sed -E 's/^([+-])(..)(..)/scale=2;0( + \/60)/' | bc

Isso lhe dará 2.00 de volta no fuso horário em que estou ( +0200 ).

Com fusos horários estranhos / incomuns:

$ echo '+0245' | sed -E 's/^([+-])(..)(..)/scale=2;0( + \/60)/' | bc
2.75

$ echo '-0245' | sed -E 's/^([+-])(..)(..)/scale=2;0( + \/60)/' | bc
-2.75

A expressão sed transformará o fuso horário em " bc script". Para o fuso horário +HHMM , o script será

scale=2;0+(HH + MM/60)

Por -HHMM será

scale=2;0-(HH + MM/60)

O zero está lá porque meu bc não entende unary + .

Se você só vai lidar com fusos horários de horas inteiras, então você pode usar

date +%z | sed -E 's/^([+-])(..)../0/' | bc

que lhe dará números inteiros.

    
por 28.03.2018 / 19:45
3

offset=$(date +%-z) daria uma saída de -400 no seu caso.

- após o símbolo % remover zero de preenchimento.

[1] Resposta relevante

    
por 28.03.2018 / 19:14
1

Se o fuso horário for um número inteiro de horas (data GNU):

$ date +%-:::z
-4

Caso contrário (suponha -0427):

$ date +%-:::z | awk -F: '{x=$1;printf("%s%.2f\n",x>=0?"+":"-",(x>=0?x:-x)+$2/60)}'
-4.45

Ou, para implementações de data mais antigas e limitadas, é claro:

$ date +%z | awk -F '' '{printf("%s%.2f\n",$1,$2$3+($4$5)/60)}'
-4.45

Isto ainda não é POSIX porque um FS nulo é indefinido para o POSIX awk.

Para POSIX, precisamos dividir os caracteres com sed:

$ date +%z |\
sed -E 's/(.)(..)(..)/  /' |\
awk '{ printf("%s%.2f\n",$1,$2+$3/60) }'
    
por 29.03.2018 / 03:33