Linux 上两个日期之间的差异

Linux 上两个日期之间的差异

我得到的日期格式为

    v_date=$(date +"%Y%m%d" -d "1970-01-01 + $(stat -c '%Z' file ) secs")
    v_sysdate=$(date +%Y%m%d)
echo "$v_date"

20150907

echo "$v_sysdate"

20150907

v_date_difference=$((${v_sysdate}-${v_date}))
echo "$v_date_difference"

返回的值是-20150907,但它应该为零。

如何获得全天日期之间的差异?

答案1

不能将两个以 YYYYMMDD 格式编写的日期相减。例如,20150907 - 20140907显然会产生 10000 而不是 365。

20150907 - 20150907确实产生 0 — 这是测试相等性的有效方法,只不过您可以直接测试相等性而不是计算减法。如果您收到-20150907,这是因为代码不是您显示的内容,并且v_sysdate包含额外的字符(空格和数字除外)。

操作日期的明智方法是将它们转换为简单的数字格式:自固定原点(一个时代)。在里面Unix世界,标准单位是秒(如 SI),纪元是 1970-01-01。

GNU 实用程序,例如datestat以该格式打印自纪元以来的秒数日期%s。使用此格式直到您需要漂亮地打印它。要date以此格式传递日期,请@在秒数之前放置。

v_date=$(stat -c '%Z' file)
v_sysdate=$(date +%s)
v_date_difference=$((v_sysdate-v_date))
date -d "@$v_date" +'File ctime: %Y%M%D'
date -d "@$v_sysdate" +'Current time: %Y%M%D'
echo "$v_date_difference seconds elapsed"
echo "$((v_date_difference / 86400)) days elapsed"

请注意,这计算的是两个时间之间的天数。例如,昨天 23:59 和今天 00:01 之间,这显示了 0 天的差异。如果您需要两个日期之间的差异,忽略一天中的时间,您可以使用一天中的参考时间。

file_midday_time=$(date +%s -d "$(date '+%Y-%m-%d 12:00' -d "@$(stat -c %Z file)")")
current_midday_time=$(date +%s -d "today 12:00")
day_difference=$(((file_midday_time - current_midday_time + 7200) / 86400))

添加 3601 到 86399 之间的数字可确保即使在日时钟从正常时间切换到夏令时(该天仅持​​续 23 小时)时也计算一天。

相关内容