我想写一个脚本或函数来告诉我从现在到未来给定日期有多少天。我正在努力解决的是如何处理给定的日期并将其与当前日期进行比较......我在想像
read -p "enter the date in the format YYYY-MM-DD "
然后我假设我有一个对 shell 没有意义的字符串,我必须做一些评估,比如......??(这只是一个例子;我猜bc
是需要的)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
然后我不知道如何处理这些数字......??
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))
我肯定让自己太难了;可能有一个文本处理工具可以理解日期并可以比较它们。
我怎样才能做到这一点?
纪元时间
一般来说,如果我们首先将时间转换为(Unix)纪元时间(从 1970 年 1 月 1 日开始的秒数),则时间计算是最容易的。在 python 中,我们有工具可以将时间转换为纪元时间,并转换回我们喜欢的任何日期格式。
我们可以简单地设置一个格式,比如:
...并定义今天:
然后编写一个函数来完成这项工作:
然后输出:
...如前所述,即自 1970 年 1 月 1 日以来的秒数
计算两个日期之间的天数
如果我们在今天和未来的日期都这样做,随后计算差异:
输出将按日期计算,因为我们使用格式
%Y-%m-%d
。例如,如果我们接近 24 小时,则四舍五入可能会产生不正确的日期差异。终端版本
...以及 Zenity 选项
而且只是为了好玩...
一个很小的应用程序。如果您经常使用它,请将其添加到快捷方式中。
剧本:
orangedays.py
运行:
把它包起来
用于以下
.desktop
文件上方的微型应用程序脚本:orangedays.desktop
为~/.local/share/applications
在行
设置脚本的实际路径...
GNU
date
实用程序非常擅长这类事情。它能够解析多种日期格式,然后以另一种格式输出。这里我们%s
用来输出自纪元以来的秒数。$now
然后从中减去$future
并除以 86400 秒/天是一个简单的算术问题:您可以尝试在 中做某事
awk
,使用该mktime
功能awk 期望以“YYYY MM DD HH MM SS”格式从标准输入读取日期,然后打印指定时间与当前时间之间的差异(以天为单位)。
mktime
简单地将时间(以指定格式)转换为距参考时间(1970-01-01 00:00:00 UTC)的秒数;systime simple 以相同的格式指定当前时间。从另一个中减去一个,您可以在几秒钟内得到它们之间的距离。除以 86400 (24 * 60 * 60) 转换为天数。这是一个 Ruby 版本
示例运行:
下面给出了脚本
ruby ./day-difference.rb
的示例运行(假设您已将其另存为day-difference.rb
)有未来的日期
日期已过
过了今天的日期
这是一个很好的网站来检查日期的差异http://www.timeanddate.com/date/duration.html
有一个
dateutils
非常方便处理日期的包。在这里阅读更多关于它的信息github:dateutils安装它
sudo apt install dateutils
对于您的问题,简单地说,
dateutils.ddiff <start date> <end date> -f "%d days"
其中输出可以选择为秒、分钟、小时、天、周、月或年。它可以方便地用于输出可用于其他任务的脚本中。
例如,
您可以使用 awk Velor 库:
或者:
如果两个日期属于同一年,一个简短的解决方案是:
使用“%j”格式,它返回日期的位置(以年为单位),即当前日期为 135。它避免了舍入问题并处理过去的日期,从而产生负面结果。
但是,跨越年份边界,这将失败。您可以为每年手动添加(或减去)365 或为每个闰年添加(或减去)366,如果超过 2 月的最后一天,但这几乎与其他解决方案一样冗长。
这里是纯 bash 解决方案:
Shellcheck 建议使用大量双引号,但对于超过 9999 年的天数,您应该考虑使用不同的方法。对于过去,它会在 1970.01.01 之前的日期静默失败。清理用户输入作为练习留给用户。
这两个函数可以重构为一个,但这可能会使它更难理解。
请注意,该脚本需要进行详尽的测试才能正确处理过去的闰年。我不敢打赌这是对的。