Gostaria de escrever um script ou função para me dizer quantos dias a partir de agora até uma determinada data no futuro. O que estou lutando para descobrir é como processar a data especificada e compará-la com a data atual ... Estou imaginando algo como
read -p "enter the date in the format YYYY-MM-DD "
E então estou assumindo que tenho uma string que não faz sentido para o shell e tenho que fazer algumas avaliações como ... ?? (Este é apenas um exemplo; acho bc
que seria necessário)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
E então eu não sei o que fazer com esses números ... ??
if $i > 1 then assign l=$((i*365)) and else what?? # what about leap years?
Using $j somehow assign m # confused before I've started
Using $k somehow assign n # just as bad
echo $((l+m+n))
Eu certamente estou tornando muito difícil para mim; provavelmente existe uma ferramenta de processamento de texto que entende datas e pode compará-las.
Como posso fazer isso?
Respostas:
Época
Em geral, os cálculos no tempo são mais fáceis se primeiro convertermos o tempo em (Unix) época (segundos de 1-1-1970). Em python, temos ferramentas para converter tempo em tempo de época e retornar a qualquer formato de data que preferirmos.
Podemos simplesmente definir um formato, como:
... e defina hoje:
e subsequentemente escreva uma função para fazer o trabalho:
Então a saída de:
... que é, como mencionado, o número de segundos desde 1-1-1970
Cálculo dos dias entre duas datas
Se fizermos isso hoje e em nossa data futura, calcule subsequentemente a diferença:
A saída será calculada por data , pois usamos o formato
%Y-%m-%d
. O arredondamento de segundos possivelmente daria uma diferença de data incorreta, se estivermos perto de 24 horas, por exemplo.Versão do terminal
... E a opção Zenity
E apenas por diversão ...
Uma pequena aplicação. Adicione-o a um atalho se você o usar com frequência.
O script:
orangedays.py
Executá-lo:
Para finalizar
Use para o pequeno script de aplicativo acima do seguinte
.desktop
arquivo:orangedays.desktop
em~/.local/share/applications
Na linha
defina o caminho real para o script ...
fonte
O utilitário GNU
date
é muito bom nesse tipo de coisa. É capaz de analisar uma boa variedade de formatos de data e depois imprimir em outro formato. Aqui usamos%s
para gerar o número de segundos desde a época. Em seguida, é uma simples questão de aritmética para subtrair$now
do$future
e dividir por 86.400 segundo / dia:fonte
-u
parâmetro adate
.Você pode tentar fazer algo
awk
usando amktime
funçãoO awk espera ler a data da entrada padrão no formato "AAAA MM DD HH MM SS" e depois imprime a diferença entre a hora especificada e a hora atual em dias.
mktime
simplesmente converte uma hora (no formato especificado) para o número de segundos de uma hora de referência (1970-01-01 00:00:00 UTC); systime simple especifica a hora atual no mesmo formato. Subtraia um do outro e você fica distante em segundos. Divida por 86400 (24 * 60 * 60) para converter em dias.fonte
Aqui está uma versão do Ruby
Exemplo de execução:
Exemplo de execução do script
ruby ./day-difference.rb
é fornecido abaixo (assumindo que você o salvou comoday-difference.rb
)Com uma data futura
Com uma data passada
Quando passou a data de hoje
Aqui está um bom site para verificar as diferenças de data http://www.timeanddate.com/date/duration.html
fonte
Existe um
dateutils
pacote que é muito conveniente para lidar com datas. Leia mais sobre isso aqui github: dateutilsInstale-o
sudo apt install dateutils
Para o seu problema, simplesmente,
dateutils.ddiff <start date> <end date> -f "%d days"
onde a saída pode ser escolhida como segundos, minutos, horas, dias, semanas, meses ou anos. Pode ser usado convenientemente em scripts em que a saída pode ser usada para outras tarefas.
Por exemplo,
fonte
Você pode usar o awk biblioteca Velour :
Ou:
fonte
Uma solução curta, se as duas datas pertencerem ao mesmo ano, é:
usando o formato "% j", que retorna a posição da data em dias no ano, ou seja, 135 para a data atual. Evita problemas de arredondamento e lida com datas no passado, fornecendo resultados negativos.
No entanto, cruzando as fronteiras do ano, isso irá falhar. Você pode adicionar (ou subtrair) 365 manualmente para cada ano ou 366 para cada ano bissexto, se o último mês de fevereiro for ultrapassado, mas isso será quase tão detalhado quanto as outras soluções.
Aqui a solução pura do bash:
O Shellcheck sugere muitas aspas duplas, mas por dias que excedem o ano de 9999 você deve considerar uma abordagem diferente. No passado, ele falharia silenciosamente em datas anteriores a 1970.01.01. A limpeza da entrada do usuário é deixada como um exercício para o usuário.
As duas funções podem ser refatoradas em uma, mas isso pode dificultar a compreensão.
Observe que o script precisa de testes exaustivos para lidar corretamente com os anos bissextos no passado. Eu não apostaria que está certo.
fonte