Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 确定日期之间的硬度_Bash_Date_Duration - Fatal编程技术网

Bash 确定日期之间的硬度

Bash 确定日期之间的硬度,bash,date,duration,Bash,Date,Duration,我对BASH编程还是相当陌生,我正在绞尽脑汁解决一个问题。我正试图为我的工作编写一个脚本,这样可以很容易地计算在正常结束日期之前取消的给定包的退款。现在简单的东西,比如输入和其他类似的东西,我相信我可以通过谷歌搜索和实验弄清楚(不过如果你愿意帮忙,我会非常感激) 我不确定自己能不能找到一个脚本或一组命令来计算两个日期之间的天数/月数,并使用该变量计算退款总额。我将尝试解释我在这里要做的事情: 输入两个日期(MM/DD/YYYY格式)并获得月和日的差值,即3个月13天 输入基本月费率 (基准*#个

我对BASH编程还是相当陌生,我正在绞尽脑汁解决一个问题。我正试图为我的工作编写一个脚本,这样可以很容易地计算在正常结束日期之前取消的给定包的退款。现在简单的东西,比如输入和其他类似的东西,我相信我可以通过谷歌搜索和实验弄清楚(不过如果你愿意帮忙,我会非常感激)

我不确定自己能不能找到一个脚本或一组命令来计算两个日期之间的天数/月数,并使用该变量计算退款总额。我将尝试解释我在这里要做的事情:

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

输入基本月费率

(基准*#个月)+(基准/30)*#天)=使用的客户数量

输入客户支付的金额-使用的金额=要退款的金额

然后最好是以一种可以用来“展示他们的作品”的方式打印出来

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

提前谢谢你的帮助


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

python
中,可以使用
datetime.strtime()
模块中的
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

假设您不希望
天数
大于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)."
如果
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}
使用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) "€"}'
date1=“12/20/2011”
日期2=“2012年2月19日”
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使用我的

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

请看。有几件事。一般来说,在提出问题时,你应该已经尝试解决你的问题,并用代码发布你已经尝试过的内容,以及你预期的输出。当你用一种新的语言编写东西时,准备放弃你的第一次尝试,即使它看起来是可行的。日期数学是在其他语言中更容易完成。在bash中,您能做的最好的事情是转换为秒,执行数学运算,然后再将其转换回。一种常见的模式是将所有时间数据转换为简单的串行格式,如Unix epoch(自1970-01-01年午夜起的秒数)然后对这些值进行所有内部计算。将其转换回人类可读的显示目的是相当简单的——只需记住将绝对时间(2012-02-18 12:34:56)与相对时间(比如,持续两周)分开即可。如果您处理的是时区,您也会希望在内部将所有内容转换为UTC。但是,请注意,在bash中对浮点数进行算术运算并不简单。在这种情况下,awk解决方案可能会更好。