bash - 将日值总结为年、月和剩余天数

bash - 将日值总结为年、月和剩余天数

有没有简单的方法可以将像(1327天)这样的天值总结为以下格式:

xx years; xx month; xx days

无需为每个值使用单独的变量。
最好用一个命令。

答案1

对于包含数月或数年的持续时间,必须参考特定日期,因为不同的月份或不同的年份具有不同的长度。

要知道从现在到 1327 天有多少年/月/日,日期工具

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

(有时您可能会发现ddiff可用 asdatediffdateutils.ddiff;同样适用于dadd)。

这就是我在 2017-09-25 得到的结果(因为那是从 2017-09-25 到 2021-05-14)。如果我在 2018 年 3 月 1 日运行它,我会得到:

3 years, 7 months, 17 days

因为那是从 2018-03-01 到 2021-10-18。

就在2018年3月1日,1327天会给3 years, 7 months, 16 days.

更多信息请访问如何使用 GNU 工具计算和格式化日期持续时间,而不是结果日期?

答案2

我认为这对于 Bash 中相当准确的解决方案(即关于闰日等日历怪异问题)来说有点太复杂了。尝试使用日历编程库(例如 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)

当然,您可以根据自己的喜好调整输入和输出格式,以根据天数以外的其他因素选择时间差异。

相关内容