2012-02-18 70 views
0

我在BASH编程方面还很新,而且我正在为一个问题而绞尽脑汁。我正在尝试为我的工作编写脚本,以便在给定的包在正常结束日期之前取消的情况下计算退款。现在简单的东西,如输入和其他这样的东西,我敢肯定,我可以通过谷歌搜索和实验(尽管你应该选择帮助我,我会非常感激)。确定日期之间的差异

我不知道我能找到自己的方法是一个脚本或一组命令,可以计算两个日期之间的天数/月数,并使用该变量计算总数ammount的退款。我会尝试解释我在这里要做的事情:

输入两个日期(MM/DD/YYYY格式)并获得IE和3个月和13天的差异。

输入基础月率

(基础×月数)+((碱基/ 30)*天数)= ammount的客户使用

输入倍受客户如何祈祷, - ammount的使用= ammount的来退还

则优选它打印它,人们可以用它来“展示自己的作品”

的方式,我知道这是一个有点过分的要求与帮助,但我真的可以用一只手的日期计算器。

感谢您提前提供任何帮助!

PS我做了一些预先搜索,我发现了类似的问题,但没有真正符合我需要的东西。

+0

见http://www.unix.com/tips-tutorials/31944-simple -date-时间calulation-bash.html。 – 2012-02-18 03:48:22

+1

一些事情。通常,在提问时,你应该已经试着解决你的问题,并有代码张贴显示你已经尝试了什么,以及你的期望输出是什么。当你用一种新语言编写某些东西时,即使它看起来有效,也要准备好抛出你的第一次尝试。日期数学更容易在其他语言中完成。你将能够在bash中做的最好的转换为秒,执行数学,然后将其转换回来。 – jordanm 2012-02-18 03:56:01

+0

一个常见的模式是将所有时间数据转换为简单的串行格式,例如Unix纪元(自1970-01-01午夜以来的秒数),并对这些值进行所有内部计算。然后转换回人类可读的显示目的是相当简单的 - 只要记住保持绝对时间(2012-02-18 12:34:56)与相对(例如两周的持续时间)分开。如果您正在处理时区,则您也需要在内部将所有内容都转换为UTC。 – tripleee 2012-02-18 13:50:51

回答

0

python,你可以使用datetime.strptime()方法从datetime模块:

$ from=01/25/2011 to=01/30/2012 
$ dur=`python -c "from datetime import datetime; print((datetime.strptime('$to', '%m/%d/%Y')-datetime.strptime('$from', '%m/%d/%Y')).days)"` 
$ echo $dur 
370 
0

假设你不想days要大于30,这将做的工作在bash:

date1="12/20/2011" 
date2="02/18/2012" 

y1=${date1/*\/*\//} 
y2=${date2/*\/*\//} 

m1=${date1/\/*\/*/} 
m2=${date2/\/*\/*/} 

d1=${date1/\/$y1/} 
d1=${d1/$m1\//} 
d2=${date2/\/$y2/} 
d2=${d2/$m2\//} 

m=$(($y2 * 12 - $y1 * 12 + $m2 - $m1)) 
d=$(($d2 - $d1)) 
test $d -lt 0 && { d=$(($d + 30)); m=$(($m - 1)); } 

echo "$m month(s) and $d day(s)." 

日期解析可以简化为以下,如果您总是有2个字符DDMM

y1=${date1:6:4} 
y2=${date2:6:4} 

m1=${date1:0:2} 
m2=${date2:0:2} 

d1=${date1:3:2} 
d2=${date2:3:2} 
+0

但是,请注意它是不是简单的在bash中对浮点数进行算术运算。 awk解决方案即将到来,在这种情况下可能会更好。 – jfg956 2012-02-18 10:59:11

0

使用awk的,你可以:

date1="12/20/2011" 
date2="02/19/2012" 
echo -e "$date1\n$date2" | awk -F "/" -v base=15 ' 
    NR == 1 {m1=$1; d1=$2; y1=$3} 
    NR == 2 {m2=$1; d2=$2; y2=$3} 
    END{m=12*(y2-y1) + m2-m1; d=d2-d1; m=d<0 ? m-1 : m; d=d<0 ? d+30 : d 
    print m " month(s) and " d " day(s)" 
    print "refund: " (base*m + (base/30.0)*d) "€"}' 
2

使用我dateutils你可以去

ddiff '2010-12-05' '2012-04-10' -f '%mmo %dd' 
=> 
    16mo 5d