确定日期之间的差异
我在BASH编程方面还很新,而且我正在为一个问题而绞尽脑汁。我正在尝试为我的工作编写脚本,以便在给定的包在正常结束日期之前取消的情况下计算退款。现在简单的东西,如输入和其他这样的东西,我敢肯定,我可以通过谷歌搜索和实验(尽管你应该选择帮助我,我会非常感激)。确定日期之间的差异
我不知道我能找到自己的方法是一个脚本或一组命令,可以计算两个日期之间的天数/月数,并使用该变量计算总数ammount的退款。我会尝试解释我在这里要做的事情:
输入两个日期(MM/DD/YYYY格式)并获得IE和3个月和13天的差异。
输入基础月率
(基础×月数)+((碱基/ 30)*天数)= ammount的客户使用
输入倍受客户如何祈祷, - ammount的使用= ammount的来退还
则优选它打印它,人们可以用它来“展示自己的作品”
的方式,我知道这是一个有点过分的要求与帮助,但我真的可以用一只手的日期计算器。
感谢您提前提供任何帮助!
PS我做了一些预先搜索,我发现了类似的问题,但没有真正符合我需要的东西。
在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
假设你不想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个字符DD
和MM
:
y1=${date1:6:4}
y2=${date2:6:4}
m1=${date1:0:2}
m2=${date2:0:2}
d1=${date1:3:2}
d2=${date2:3:2}
但是,请注意它是不是简单的在bash中对浮点数进行算术运算。 awk解决方案即将到来,在这种情况下可能会更好。 – jfg956 2012-02-18 10:59:11
使用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) "€"}'
见http://www.unix.com/tips-tutorials/31944-simple -date-时间calulation-bash.html。 – 2012-02-18 03:48:22
一些事情。通常,在提问时,你应该已经试着解决你的问题,并有代码张贴显示你已经尝试了什么,以及你的期望输出是什么。当你用一种新语言编写某些东西时,即使它看起来有效,也要准备好抛出你的第一次尝试。日期数学更容易在其他语言中完成。你将能够在bash中做的最好的转换为秒,执行数学,然后将其转换回来。 – jordanm 2012-02-18 03:56:01
一个常见的模式是将所有时间数据转换为简单的串行格式,例如Unix纪元(自1970-01-01午夜以来的秒数),并对这些值进行所有内部计算。然后转换回人类可读的显示目的是相当简单的 - 只要记住保持绝对时间(2012-02-18 12:34:56)与相对(例如两周的持续时间)分开。如果您正在处理时区,则您也需要在内部将所有内容都转换为UTC。 – tripleee 2012-02-18 13:50:51