date processa o primeiro parâmetro incorretamente se não for 1

6

Estou usando date (GNU coreutils) 8.22 e tendo alguns problemas para calcular uma data após uma determinada.

Digamos que eu queira usar o 1º de fevereiro, por exemplo:

$ date -d'1 February'
Sun Feb  1 00:00:00 CET 2015

Depois, quero adicionar uma semana à data. Até aqui tudo bem:

$ date -d '1 February + 1 week'
Thu Feb  8 00:00:00 LMT 0001

Mas se eu adicionar algo como o primeiro item não sendo 1 , ele falhará e retornará algo incorreto:

$ date -d '1 February + 2 weeks'  # returns as if it was +1 week
Fri Feb  8 00:00:00 LMT 0002      # but Fri instead of Thu, also LMT 0002

No entanto, se adicionarmos mais parâmetros na frente, funciona:

$ date -d '1 February + 0 minutes + 2 week' # works since we added 0/1 unit before
Tue Feb 15 00:01:00 LMT 0000
$ date -d '1 February + 1 minute + 1 day + 1 week' # works fine
Fri Feb  9 00:01:00 LMT 0001
$ date -d '1 February + 1 minute + 25 day + 7 week'  # works since 1st parameter is 1!
Mon Apr 16 00:01:00 LMT 0001

Observe que isso não acontece se fornecermos datas relativas:

$ date -d 'today + 1 week'
Wed Jul  1 12:20:03 CEST 2015
$ date -d 'today + 2 week'    # works fine
Wed Jul  8 12:20:12 CEST 2015

Então, por que date considera o primeiro parâmetro sempre como 1 e alguma ação estranha se a data é dada com uma data específica?

    
por fedorqui 24.06.2015 / 12:23

2 respostas

4

Ok, então eu fiz algumas pesquisas e está interpretando o primeiro número como o ano, parece que o + e totalmente superficial e completamente ignorado.

Usando seus exemplos.

$ date -d'1 February'
Sun Feb  1 00:00:00 CET 2015

Funciona totalmente como esperado, pois nenhum ano é fornecido.

$ date -d '1 February + 1 week'
Thu Feb  8 00:00:00 LMT 0001

Quase parece certo, mas você notará que o ano mudou para 0001 , pois o + é ignorado e, portanto, o comando é visto como

 {1 February 1} {+ 1}{week}
      date      

O {+1} parece ser padrão por qualquer período após a data.

Outro exemplo que parece funcionar, mas não funciona

$ date -d '1 February + 1 minute + 25 day + 7 week'  # works since 1st parameter is 1!
Mon Apr 16 00:01:00 LMT 0001

Como você pode ver, o ano foi incrementado para 0001. Os minutos foram referenciados para incrementar pelo padrão 1, e então todos os outros comandos não fazem parte da data, portanto, são incrementados de acordo.

Como prova adicional de que ele funcione dessa maneira, siga este exemplo que funciona

$date -d '1 February 4 5 weeks'
Sun Mar  7 00:00:00 LMT 0004

e funciona da mesma forma que

$date -d '1 February + 4 + 5 weeks'
Sun Mar  7 00:00:00 LMT 0004

O que significa que os + são ignorados e o primeiro número depois deles é visto como o ano se o ano não for especificado anteriormente.

Obviamente, se você quiser subtrair, isso deve ser explicitamente declarado, embora ainda seja ignorado se o ano não tiver sido especificado para o primeiro número.

$date -d '1 February -4 weeks'
Sun Feb  8 00:00:00 LMT 0004
                         ^
                         Year incremented by 4.

Embora se você usá-lo em um formato especificado na página man ou seja

$date -d ' Feb 2 -4 weeks'
Mon Jan  5 00:00:00 GMT 2015

Em seguida, ele funcionará inteiramente como pretendido, sem necessidade de nenhum ano:)

    
por 24.06.2015 / 13:01
2

Parece estar interpretando o segundo dígito como o ano e, em seguida, assumindo 1 semana (s), então sempre adicionar um ano, como this year , então eu acho que você vai conseguir o que deseja. por exemplo.

christian@fujiu1404:~$ date -u -d'1 feb this year -2 weeks'
Sun Jan 18 00:00:00 UTC 2015
christian@fujiu1404:~$ date -u -d'1 feb this year +2 weeks'
Sun Feb 15 00:00:00 UTC 2015
christian@fujiu1404:~$ date -u -d'1 feb this year +3 weeks'
Sun Feb 22 00:00:00 UTC 2015
    
por 24.06.2015 / 12:55

Tags