如何在bash下获得两个日期之间的差异

时间:2012-01-25 19:18:55

标签: linux bash date

正如问题听起来的那样。 我想从20120203减去说20120115并得到19作为答案。 在shell脚本中实现此功能的最佳方法是什么?

3 个答案:

答案 0 :(得分:27)

let DIFF=(`date +%s -d 20120203`-`date +%s -d 20120115`)/86400
echo $DIFF

答案 1 :(得分:0)

可以在脚本中使用的快速而彻底的修复程序(快速且快速):

此函数gendates以YYYYmmdd格式(最早的格式)生成两个日期之间的有效日期列表。

function gendates { for dd in $(seq -w $1 $2) ; do date -d $dd +%Y%m%d 2>/dev/null ; done  ; }                                                                             

我将此函数用于与日志文件相关的多个目的,例如生成要检查的日志文件名列表[1]。并且计算天数的差异也很方便:

echo "$(gendates YYYYmmdd YYYYmmdd)" | wc -l

当然,YYYYmmdd必须是约会。它仅适用于1美元的早期日期超过2美元而且它对于大日期差异来说很慢,但是在几年的时间内用于临时脚本编写它非常方便。

如果您碰巧安装了MySQl或类似产品,那么有一个非常快速的选择:

mysql -BNe "SELECT DATEDIFF($1,$2) AS DiffDate ;" | tr -d -

最后tr允许您以任何顺序输入日期(如果第一个日期早于第二个日期,MySQL会提示' - '

[1]生成日期列表的原因是,我可以生成这种格式的日志文件的名称:YYYYmmdd.log.gz。我可以使用星号或$(ls)来做到这一点,但这比仅提供带字符串的列表要慢。

答案 2 :(得分:0)

我的解决方法是:(希望它最终包含更多有用的东西)

current="$(date +%s.%N)" #current date precise to ns
old="$(date +%s.%N -d "$(sh some_script_that_gives_a_date.sh)")" #convert to seconds too
diff=$(echo "$current-$olc" |bc)

date +%s.%N -d $1采用任意日期并将其转换为给定格式。


要将其转换回可读的格式,可以使用

date $2 -d @0$diff #Pad diff with leading zero

其中$ 2是日期格式,请参见https://www.tutorialkart.com/bash-shell-scripting/bash-date-format-options-examples/