As operações aritméticas na data de bash… ¿estão invertidas?

2

Editar: usando o Amazon Linux:

Linux ip-xx-xx-xx-xxx 3.14.44-32.39.amzn1.x86_64 # 1 SMP Qui Jun 11 20:33:38 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux

Saída deste comando:

date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22"

2015-07-27 00:11:22

Saída deste comando:

date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 + 00:05"

2015-07-27 00:06:22

Saída deste comando:

date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 - 00:05"

2015-07-27 00:16:22

OMFG é o tempo que flui para trás? Ou um problema de 8ª camada?

Editar : Meu Amazon Linux está em UTC + 00: 00, enquanto minha máquina local do Ubuntu está em UTC-05: 00. Os mesmos comandos no Ubuntu mostram:

2015-07-26 19:11:22

2015-07-26 19:06:22

2015-07-26 19:16:22

respectivamente, então + 00:05 não parece ser o fuso horário.

    
por Luis Masuelli 27.07.2015 / 23:33

1 resposta

2

De acordo com a fonte de análise -datetime.y do gnulib , parece ser uma funcionalidade relacionada com a função time_zone_hhmm .

Primeiro, não podemos usar seu formato para adicionar segundos: date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 - 00:05:01" , estou com um erro de análise:

date: invalid date ‘2015-07-27 00:11:22 - 00:05:01’

Então, de acordo com o cabeçalho da função time_zone_hhmm:

/* Convert a time zone expressed as HH:MM into an integer count of
minutes.  If MM is negative, then S is of the form HHMM and needs
to be picked apart; otherwise, S is of the form HH.  As specified in
http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow
only valid TZ range, and consider first two digits as hours, if no
minutes specified.  */

Parece que você está modificando o fuso horário, que corresponde ao comportamento do tempo de adição / remoção invertido.

Se você quiser realizar artromias pontualmente, é melhor usar os registros de data e hora da Epoch (data + '% s'), que são mais fáceis de realizar cálculos. Além disso, eles são baseados no horário UTC, que não leva em conta o fuso horário local do servidor em que você está trabalhando.

Um timestamp retornará o mesmo resultado nos EUA, na Ásia ou na Europa. Em seguida, você usa esse carimbo de data / hora para exibir o tempo de leitura humana, o que leva em conta o Fuso Horário.

De qualquer forma, boa captura. Eu nunca teria cavado a fonte do gnulib sem esse truque legal!

    
por 28.07.2015 / 00:08

Tags