Для продолжительности, включающей несколько месяцев или лет, которая должна ссылаться на конкретную дату, поскольку разные месяцы или разные годы имеют разную продолжительность.
Чтобы узнать, сколько лет/месяцев/дней осталось до 1327 дней, с помощью dateutils:
$ ddiff -f '%Y years, %m months, %d days' today "$(dadd now 1327)"
3 years, 7 months, 19 days
(вы можете иногда найти ddiff
доступным как datediff
или dateutils.ddiff
; то же самое дляdadd
).
Вот что я получаю сейчас на 2017 -09 -25 (, потому что это с 2017 -09 -25 по 2021 -05 -14 ). Если бы я запустил это в 2018 -03 -01, я бы получил:
3 years, 7 months, 17 days
потому что это с 2018 -03 -01 по 2021 -10 -18.
И в тот 2018 -03 -01 день, 1327 дней назад даст 3 years, 7 months, 16 days
.
Дополнительная информация на Как рассчитать и отформатировать продолжительность даты с помощью инструментов GNU, а не дату результата?
Я думаю, что это слишком сложно для достаточно точного решения (i. е. относительно странностей календаря, таких как високосные дни )в Баше. Вместо этого попробуйте что-нибудь с библиотекой программирования для календарей, такой как 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))
Пример вызова:
$./human-redable-date-difference.py 1327
3 year(s); 7 month(s); 19 day(s)
Конечно, вы можете настроить формат ввода и вывода по своему вкусу, чтобы выбрать разницу во времени на основе других факторов, а не количества дней.