Calcular dias desde 1/1/1970

9

Como você pode calcular o número de dias desde 1/1/1970? Isso é para atualizar o atributo shadowLastChange no OpenLDAP.

Existe uma maneira de fazer isso usando o comando linux date ?

    
por nitins 10.01.2011 / 14:34

4 respostas

17

ring0 me bateu por alguns segundos, mas o comando completo é:

echo $(($(date --utc --date "$1" +%s)/86400))

Isso passa pela hora UTC. Resultado:

root@hostname:~# echo $(('date --utc --date "$1" +%s'/86400))
14984

Uma rápida verificação com o WolframAlpha mostra que esse é o valor correto.

    
por 10.01.2011 / 14:42
9

O comando date pode fornecer o número de segundos desde 1970-01-01 00:00:00 UTC .

  date +"%s"

Você pode dividir o resultado por 3600*24 para obter o número de dias (UTC).

Por exemplo no Bash

  x='date +"%s"' ; echo $(( $x / 3600 / 24 ))

para exibir o número de dias.

    
por 10.01.2011 / 14:40
7

Acho que esse é o método mais simples:

expr $(date +%s) / 86400
    
por 16.09.2015 / 20:18
1

Eu precisava resolver isso também, mas queria obter o mesmo valor para o dia #, independentemente da hora do dia. Com abordagens como as mostradas aqui, o valor será alterado à meia-noite no UTC em vez da meia-noite no horário local. Isso provavelmente parece ser um problema menor na UE ou na Costa Leste dos EUA, que estão próximos o suficiente do UTC de que o valor do dia não mudará no meio do dia normal de trabalho, mas, por exemplo, na Califórnia, a mudança do dia ocorreria às 16:00 PST, o que pode ser inconveniente. Eu imagino que os australianos ficariam especialmente irritados por ter a mudança no valor do dia no final da manhã.

Se quisermos corrigir isso, precisamos adicionar o deslocamento de UTC antes de dividir por segundos / dia. Felizmente, o comando data do Linux inclui uma sequência de formato % z que relata o deslocamento de UTC. Enquanto o formato padrão (este resultado é para o horário de Denver, MDT):

$ date +%z
-0600

. . não é diretamente utilizável em um cálculo, os modificadores certos produzirão o que queremos:

$ date +%-:::z
-6

Coloque junto com as conversões usuais de segundos / dias / dias, e acredito que o seguinte deve exibir os dias desde 1/1/1970, com 1/1/1970 sendo o dia zero, e o valor incrementando à meia-noite local tempo:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

Esse cálculo simples não funcionará para fusos horários que não sejam deslocados do UTC por horas inteiras (por exemplo, Índia, TZ = Ásia / Kolkata), pois o "+5: 30" produzido por date +%-:::z produzirá um " caractere inválido na expressão "erro quando usado na declaração acima.

    
por 07.06.2017 / 01:35