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