Não, não há ordem de precedência.
Ironicamente, isso só surgiu na lista de discussão dos usuários do Debian este mês, onde foi apontado que para um ser humano lendo a suposta linguagem humana legível a manipulação da data natural comanda o comportamento da ferramenta GNUdate
bastante enlouquecedoramente inconsistente. Vincent Lefèvre deu estes exemplos:
jdebp % date +%Y-%m-%d -d '2003-02-01 - 1 month' 2003-01-01 jdebp % date +%Y-%m-%d -d '2003-02-01 - 31 days' 2003-01-01 jdebp % date +%Y-%m-%d -d '2003-02-01 - 31 days + 1 month' 2003-01-29 jdebp % date +%Y-%m-%d -d '2003-02-01 - 1 month + 1 month' 2003-02-01 jdebp % date +%Y-%m-%d -d '2003-09-01 1 day ago + 1 month' 2003-09-30 jdebp % date +%Y-%m-%d -d '2003-09-01 1 day ago' 2003-08-31 jdebp % date +%Y-%m-%d -d '2003-08-31 + 1 month' 2003-10-01 jdebp %
O que realmente está acontecendo internamente em date
é que durante o cálculo ele está construindo datas inválidas intermediárias com valores negativos em locais, como 2003-03-(-30)
, por exemplo. Então, renormaliza essas datas inválidas depois que tudo estiver pronto, usando uma função da biblioteca padrão da linguagem C.
O que é não fazer é renormalizar a cada passo , como um humano faz. Portanto, 2003-02-01 menos 31 dias para o programa date
do GNU é uma data inválida, o negativo em 30 de fevereiro , e não uma data válida em janeiro como um ser humano pode calcular. Adicione um mês, e isso se torna uma data inválida em março, ainda a 30 negativa, que finalmente renormaliza para essa data em janeiro, porque é claro que o ajuste para transformar -30
em um número maior que zero retrocede todo o mês de fevereiro. As datas inválidas não-normalizadas nos outros exemplos são 2003-10-00
, 2003-09-00
e 2003-09-31
.
Aplicando isso ao seu exemplo:
-
2017-12-31 + 1 day
é2017-12-32
, que renormaliza para2018-01-01
na saída do programa. -
2018-01-01 - 1 month
é2018-00-01
, que renormaliza para2017-12-01
na saída do programa. -
2017-12-31 + 1 day - 1 month
é2017-11-32
, que renormaliza para2017-12-02
na saída do programa.
Como você pode ver quando você renormaliza a cada passo você não obtém o mesmo resultado que aplicar todas as mudanças de uma só vez, porque o GNU date
aplica múltiplas mudanças de uma só vez < em> não renormaliza a cada passo .
Leitura adicional
- Michael Stone (2013-11-21).
/bin/date
: inconsistências de análise de data . Debian Bug # 729952. - Ulf Zibis (2017-03-15). Ordem de cálculo contraproducente em
date
. Bug GNU # 26101. - Vincent Lefèvre (2018-02-06). política em torno da tag de bug 'wontfix' . debian-users.