bash - resume o valor do dia para os anos, mês e dias da esquerda

5

Existe alguma maneira simples de resumir um valor de dia como (1327 dias) para o formato:

xx years; xx month; xx days

sem ter que usar uma variável separada para cada valor.
De preferência com um comando.

    
por nath 25.09.2017 / 17:12

2 respostas

9

Por um período que inclua um número de meses ou anos, isso deve fazer referência a uma data específica, já que meses diferentes ou anos diferentes têm comprimentos diferentes.

Para saber quantos anos / meses / dias de agora até 1327 dias a partir de agora, com dateutils :

$ ddiff -f '%Y years, %m months, %d days' today "$(dadd now 1327)"
3 years, 7 months, 19 days

(às vezes você pode encontrar ddiff disponível como datediff ou dateutils.ddiff ; o mesmo para dadd ).

É o que recebo agora em 2017-09-25 (porque é de 2017-09-25 a 2021-05-14). Se eu fosse para correr em 2018-03-01, eu ficaria:

3 years, 7 months, 17 days

porque é de 2018-03-01 a 2021-10-18.

E naquele dia de 2018-03-01, 1327 dias atrás dariam 3 years, 7 months, 16 days .

Mais informações em Como posso calcular e formatar uma duração de data usando ferramentas GNU e não uma data de resultado?

    
por 25.09.2017 / 17:35
3

Eu acho que é um pouco complicado demais para uma solução razoavelmente precisa (ou seja, sobre esquisitices de calendário como dias bissextos) no Bash. Tente algo com uma biblioteca de programação para calendários como o Python:

#!/usr/bin/env python3
import sys, calendar
from datetime import *

difference = timedelta(days=int(sys.argv[1]))
now = datetime.now(timezone.utc).astimezone()
then = now - difference

years = now.year - then.year
months = now.month - then.month
days = now.day - then.day
if days < 0:
    days += calendar.monthrange(then.year, then.month)[1]
    months -= 1
if months < 0:
    months += 12
    years -= 1

print('{} year(s); {} month(s); {} day(s)'.format(years, months, days))

Exemplo de invocação:

$ ./human-redable-date-difference.py 1327
3 year(s); 7 month(s); 19 day(s)

É claro que você pode ajustar o formato de entrada e saída ao seu gosto para selecionar diferenças de horário com base em outras coisas além do número de dias.

    
por 25.09.2017 / 20:39

Tags