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 é:
@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 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:
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.
$()
é preferível aos reticulares, por questões de legibilidade e outras razões .echo $(( $(date ...) / 86400 ))
Respostas:
ring0 me venceu por alguns segundos, mas o comando completo é:
Isso passa pela hora UTC. Resultado:
Uma verificação rápida com WolframAlpha mostra que esse é o valor correto.
fonte
O
date
comando pode fornecer o número de segundos desde então1970-01-01 00:00:00 UTC
.Você pode dividir o resultado
3600*24
para obter o número de dias (UTC).Por exemplo, no Bash
para exibir o número de dias.
fonte
Eu acho que este é o método mais simples:
fonte
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):
. . . não é diretamente utilizável em um cálculo, os modificadores certos produzirão o que queremos:
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:
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 +%-:::z
produzirá um erro "caractere inválido na expressão" quando usado na declaração acima.fonte