Shell中如何计算两个日期之间的天数?

=Start=

缘由:

在程序中用到和日期相关的循环时,可能会需要提前确定两个日期之间的天数;还有就是在日常的一些记录中也会想了解两个日期之间的天数;总之,这样的需求是很多的。

正文:

参考解答:

使用GNU的date命令,它允许你通过「-d」选项指定(它能识别的)任意格式的日期,然后通过「+%s」选项将日期转换成从「1970-01-01 00:00:00 UTC」以来经过的秒数,两者相减然后除以一天中包含的秒数(24*60*60=86400秒)即可知道两个日期之间相距的天数。

datediff() {
    d1=$(date -d "$1" +%s)
    d2=$(date -d "$2" +%s)
    echo $(( (d1 - d2) / 86400 )) days
}
$ datediff '1 Nov' '1 Aug'
91 days
$ datediff 2016-12-10 2016-12-4
6 days
$ datediff 2016-12-10 2016/12/4
6 days
$ datediff 2016-12-4 2016-12-10
-6 days

&

bash-4.2$ mysql <<< "select datediff(current_date,'1980-06-14')"
datediff(current_date,'1980-06-14')
13332
bash-4.2$ psql <<< "select current_date-'1980-06-14'"
 ?column?
----------
    13332
(1 row)
bash-4.2$ sqlite2 <<< "select julianday('now')-julianday('1980-06-14');"
13332.1524537035

&

$ echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s"))) / 86400))

&

$ cat > datediff.sh
#!/bin/bash
firstdate=$1;
secondate=$2;
fullyear=$(date -d@$(( ( $(date -ud "$secondate" +'%s') - $(date -ud "$firstdate" +'%s') ) )) +'%Y years %m months %d days %H hours %M minutes %S seconds')
yearsubtraction=$(( $(echo $fullyear | sed -r 's/^([0-9]+).*/\1/') - 1970 ))
if [ $yearsubtraction -le '0' ]; then
  echo $fullyear | sed -r "s/^([0-9]+) years //"
else
  echo $fullyear | sed -r "s/^([0-9]+) /$(printf %02d $yearsubtraction) /"
fi
$ chmod +x datediff.sh
$ ./datediff.sh '2013-07-22 11:55:19' '2015-12-25 02:00:13'
02 years 06 months 04 days 16 hours 04 minutes 54 seconds
$ ./datediff.sh '2013-07-22 11:55:19' '2013-12-25 02:00:13'
06 months 05 days 16 hours 04 minutes 54 seconds
参考链接:

=END=

声明: 除非注明,CrazyOf.me文章均为原创,转载请以链接形式标明本文地址,谢谢!
http://crazyof.me/blog/archives/3055.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注