Calcular dias desde 1/1/1970

10

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 ?

nitinas
fonte
No Bash e nas conchas mais modernas derivadas de Bourne, $()é preferível aos reticulares, por questões de legibilidade e outras razões . echo $(( $(date ...) / 86400 ))
Pausado até novo aviso.
Ainda não tem 2000 ... alguém pode editar e corrigir o título :-)
Anel Ø

Respostas:

20

ring0 me venceu 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 verificação rápida com WolframAlpha mostra que esse é o valor correto.

Dave Drager
fonte
1
que tal pular segundos? :)
netvope
1
@netvope Após um segundo de salto adicional, o tempo unix é redefinido por um novamente. Portanto, cada dia adiciona exatamente 86400 segundos unix. No entanto, uma hora Unix 915148800 podem representar ambos UTC 1998-12-31T23: 59: 60 e 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski
9

O datecomando pode fornecer o número de segundos desde então 1970-01-01 00:00:00 UTC.

  date +"%s"

Você pode dividir o resultado 3600*24para 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.

Anel Ø
fonte
9

Eu acho que este é o método mais simples:

expr $(date +%s) / 86400
Cavalo escuro
fonte
Por que isso é prejudicado? É o melhor e mais curto e mais simples resposta
Tom Corelis
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 UTC, em vez da meia-noite, horário local. Provavelmente, isso parece ser um problema menor na UE ou na costa leste dos EUA, que são próximas o suficiente do UTC para que o valor do dia não mude no meio do dia normal de trabalho, mas, por exemplo, na Califórnia, o dia muda ocorreria às 16:00 PST, o que pode ser inconveniente. Eu imagino que os australianos ficariam especialmente irritados por mudar o valor do dia no final da manhã.

Se quisermos corrigir isso, precisamos adicionar o deslocamento do UTC antes de dividir por segundos / dia. Felizmente, o comando date do Linux inclui uma sequência de formato % z que relata o deslocamento do 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 isso junto com as conversões usuais de segundos / horas / dias, e acredito que o seguinte deve gerar os dias desde 1/1/1970, com 1/1/1970 sendo o dia zero e o valor aumentando à meia-noite no horário local:

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 / Calcutá), pois o "+5: 30" produzido por date +%-:::zproduzirá um erro "caractere inválido na expressão" quando usado na declaração acima.

oracleif
fonte