Por que há uma diferença com a data Unix entre 2 e 3 meses?

16

Como isso é possível e como eu lido com isso? Estou fazendo um script de backup que depende do Unix date e descobri um bug interessante:

[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun  1 00:08:50 CEST 2014
    
por Shirker 12.06.2014 / 04:21

3 respostas

43

Você está vendo esse comportamento por causa do horário de verão (horário de verão).

Como você está no horário de verão, quando o relógio está uma hora adiantado, quando você pergunta três meses atrás, pouco depois da meia-noite de 1 de junho, o tempo acaba sendo uma hora "mais cedo" porque não horário de verão há três meses.

A documentação da data GNU sugere trabalhar em torno deste usando 12:00 e 15 do mês como pontos de partida, ao pedir dias ou meses relativos, respectivamente. Por exemplo:

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"
    
por 12.06.2014 / 04:44
14

Se o tempo absoluto é sua principal preocupação, provavelmente é melhor trabalhar em UTC , pois existe para esse propósito. A resposta de Michael é muito útil para quando você tem que trabalhar dentro do problema, mas geralmente é uma boa idéia evitá-lo totalmente onde você puder.

Quando o sistema não está definido como UTC por padrão, a maneira mais simples de passar o fuso horário é prefixando seu comando com a variável de ambiente TZ . Isso limita a troca de zona a um único comando e impede que a variável vaze para os comandos subsequentes.

$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014

O que você não deve fazer é exportar a variável TZ , pois isso pode tornar as coisas muito confusas para solucionar problemas, conforme demonstrado a seguir.

$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014
    
por 12.06.2014 / 05:49
-3

Neste ano específico em que o seu computador pensa que está a ser operado e na data específica escolhida para um teste de "1 mês atrás, há 2 meses e 3 meses atrás, sim - é provável que seja uma detecção de 29 de fevereiro Nem sempre um erro, mas ..

Agora, hoje NÃO é 2014-06-01. Tente novamente. Defina a data do computador para 2013-06-01. Tente novamente.
Defina a data do computador para 2014-09-01. Tente novamente.

    
por 12.06.2014 / 05:18