如何find两个date之间的差异?

A = “2002-20-10”
B = “2003-22-11”

如何find两个date之间的差异?

如果您有GNU date ,则允许打印任意date的表示( -d选项)。 在这种情况下,将date转换为从EPOCH开始的秒数,减去24 * 3600除。

或者你需要一个便携式的方式?

bash的方式 – 将date转换为%y%m%d格式,然后您可以直接从命令行执行此操作:

 echo $(( ($(date --date="031122" +%s) - $(date --date="021020" +%s) )/(60*60*24) )) 

在python中

 $python -c "from datetime import date; print (date(2003,11,22)-date(2002,10,20)).days" 398 

如果选项-d在您的系统中工作,这是另一种方法。 有一个警告,它不会考虑闰年,因为我已经考虑每年365天。

 date1yrs=`date -d "20100209" +%Y` date1days=`date -d "20100209" +%j` date2yrs=`date +%Y` date2days=`date +%j` diffyr=`expr $date2yrs - $date1yrs` diffyr2days=`expr $diffyr \* 365` diffdays=`expr $date2days - $date1days` echo `expr $diffyr2days + $diffdays` 

小心! 这里的许多bash解决scheme在夏时制开始date(适用时)的date范围内被打破。 这是因为$((math))构造对结果值进行“floor”/ truncation操作,只返回整个数字。 让我说明一下:

DST于今年3月8日在美国开始,所以让我们使用一个date范围跨度:

 start_ts=$(date -d "2015-03-05" '+%s') end_ts=$(date -d "2015-03-11" '+%s') 

让我们看看我们用双括号得到什么:

 echo $(( ( end_ts - start_ts )/(60*60*24) )) 

返回“5”。

这样做更加准确地使用“bc”给了我们不同的结果:

 echo "scale=2; ( $end_ts - $start_ts )/(60*60*24)" | bc 

返回“5.95” – 缺less0.05是DST切换的丢失时间。

那么如何正确地做到这一点呢?
我会build议使用这个,而不是:

 printf "%.0f" $(echo "scale=2; ( $end_ts - $start_ts )/(60*60*24)" | bc) 

在这里,'printf'是由'bc'计算的更准确的结果,给我们正确的date范围'6'。

为了您的方便,这里是MAC OS X版本。

 $ echo $(((`date -jf %Y-%d-%m $B +%s` - `date -jf %Y-%d-%m $A +%s`)/86400)) 

的nJoy!

即使你没有GNUdate,你也可能会安装Perl:

 use Time::Local; sub to_epoch { my ($t) = @_; my ($y, $d, $m) = ($t =~ /(\d{4})-(\d{2})-(\d{2})/); return timelocal(0, 0, 0, $d+0, $m-1, $y-1900); } sub diff_days { my ($t1, $t2) = @_; return (abs(to_epoch($t2) - to_epoch($t1))) / 86400; } print diff_days("2002-20-10", "2003-22-11"), "\n"; 

由于夏令时,这将返回398.041666666667 – 398天和一个小时。


问题反馈在我的饲料上。 下面是使用Perl捆绑模块的更简洁的方法

 days=$(perl -MDateTime -le ' sub parse_date { @f = split /-/, shift; return DateTime->new(year=>$f[0], month=>$f[2], day=>$f[1]); } print parse_date(shift)->delta_days(parse_date(shift))->in_units("days"); ' $A $B) echo $days # => 398 

我会在Ruby中提交另一个可能的解决scheme。 看起来这是迄今为止最小最清晰的一个:

 A=2003-12-11 B=2002-10-10 DIFF=$(ruby -rdate -e "puts Date.parse('$A') - Date.parse('$B')") echo $DIFF 

在UNIX上你应该安装GNUdate。 你不需要背离bash。 这里是考虑日子的解决scheme,只是为了显示步骤。 它可以简化和扩展到完整的date。

 DATE=$(echo `date`) DATENOW=$(echo `date -d "$DATE" +%j`) DATECOMING=$(echo `date -d "20131220" +%j`) THEDAY=$(echo `expr $DATECOMING - $DATENOW`) echo $THEDAY 

试试这个:

 perl -e 'use Date::Calc qw(Delta_Days); printf "%d\n", Delta_Days(2002,10,20,2003,11,22);' 

另一个Python版本:

 python -c "from datetime import date; print date(2003, 11, 22).toordinal() - date(2002, 10, 20).toordinal()" 

假设我们手动将Oracle数据库备份到第三级磁盘。 然后我们要删除该磁盘上的旧备份。 所以这里是一个小的bash脚本:

 #!/bin/sh for backup_dir in {'/backup/cmsprd/local/backupset','/backup/cmsprd/local/autobackup','/backup/cfprd/backupset','/backup/cfprd/autobackup'} do for f in `find $backup_dir -type d -regex '.*_.*_.*' -printf "%f\n"` do f2=`echo $f | sed -e 's/_//g'` days=$(((`date "+%s"` - `date -d "${f2}" "+%s"`)/86400)) if [ $days -gt 30 ]; then rm -rf $backup_dir/$f fi done done 

修改dirs和保留期限(“30天”)以适合您的需要。

使用http://cfajohnson.com/shell/ssr/ssr-scripts.tar.gz中的shell函数;; 他们在任何标准的Unix shell中工作。

 date1=2012-09-22 date2=2013-01-31 . date-funcs-sh _date2julian "$date1" jd1=$_DATE2JULIAN _date2julian "$date2" echo $(( _DATE2JULIAN - jd1 )) 

请参阅http://cfajohnson.com/shell/ssr/08-The-Dating-Game.shtml上的文档;

使用mysql命令

 $ echo "select datediff('2013-06-20 18:12:54+08:00', '2013-05-30 18:12:54+08:00');" | mysql -N 

结果:21

注:计算中只使用数值的date部分

参考: http : //dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_datediff

假定一个月是一年的1/12:

 #!/usr/bin/awk -f function mktm(datespec) { split(datespec, q, "-") return q[1] * 365.25 + q[3] * 365.25 / 12 + q[2] } BEGIN { printf "%d\n", mktm(ARGV[2]) - mktm(ARGV[1]) } 

对于MacOS塞拉(也许从Mac OS X yosemate),

为了从文件中获得纪元时间(从1970年开始),并将其保存到var: old_dt=`date -j -r YOUR_FILE "+%s"`

获得当前时间的纪元时间new_dt=`date -j "+%s"`

为了计算上述两个历元时间的(( diff = new_dt - old_dt ))

要检查diff是否超过23天(( new_dt - old_dt > (23*86400) )) && echo Is more than 23 days