Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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

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 - Fatal编程技术网

在bash中查找两个日期之间的差异

在bash中查找两个日期之间的差异,bash,date,Bash,Date,我试图通过以下方式获得两个日期之间的差异: date -d $(echo $(date -d "Sun Dec 29 02:22:19 2013" +%s) - $(date -d "Sun Dec 28 03:22:19 2013" +%s) | bc) 然而,这又回来了 date: invalid date ‘82800’ 这是为什么?我如何才能得到想要的结果?您可以使用: date1="Sat Dec 28 03:22:19 2013" date2="Sun Dec 29 02:22:

我试图通过以下方式获得两个日期之间的差异:

date -d $(echo $(date -d "Sun Dec 29 02:22:19 2013" +%s) - $(date -d "Sun Dec 28 03:22:19 2013" +%s) | bc)
然而,这又回来了

date: invalid date ‘82800’
这是为什么?我如何才能得到想要的结果?

您可以使用:

date1="Sat Dec 28 03:22:19 2013"
date2="Sun Dec 29 02:22:19 2013"
date -d @$(( $(date -d "$date2" +%s) - $(date -d "$date1" +%s) )) -u +'%H:%M:%S'
输出为:

23:00:00
但是,对于24小时内的任意差异,您必须开始担心天数的值将如何表示。负值也会带来问题

问题在于,如果删除格式字符串,则显示的日期为:

Thu Jan  1 23:00:00 UTC 1970
因此,虽然这适用于两个给定的日期/时间值,但它并不是一个通用的解决方案

考虑为一年中的某一天添加
%j
;它将在长达1年的时间内半正常工作

否则,捕获变量中的差异,并通过单独的计算显示结果

date1="Sat Dec 28 03:22:19 2013"
date2="Sun Dec 29 02:22:19 2013"
delta=$(( $(date -d "$date2" +%s) - $(date -d "$date1" +%s) ))
if [[ $delta -lt 0 ]]
then sign="-"; delta=${delta/^-/}
else sign="+"
fi
ss=$(( $delta % 60 ))
delta=$(( $delta / 60 ))
mm=$(( $delta % 60 ))
delta=$(( delta / 60 ))
hh=$(( $delta % 24 ))
dd=$(( $delta / 24 ))
printf "$sign%d %.2d:%.2d:%.2d\n" $dd $hh $mm $ss
输出:

+0 23:00:00

(意思是:0天、23小时、0分钟、0秒的正差。)将1000天这样的天数拆分为年、月和日,而不考虑任何参考日期,这是一件令人担忧的事情。在这里,有参考日期来帮助,但它仍然是。。。有趣。

您希望差异显示为什么格式?82800是23小时内的秒数,即时间差。但是外部的
date-d
需要一些可识别的日期helpful@JonathanLeffler与两个输入日期的格式相同这是胡说八道-时间间隔不能表示为日期。或者,更确切地说,它可以,但答案(a)涉及到伪造单位,(b)最终成为1970-01-01的时间。@JonathanLeffler说得不错。有什么方法可以用通常的
+%
序列指定日期格式吗?如果你这样写,你的代码会更清晰:
if((delta<0))
((ss=delta%60))
等等为什么12月28日和29日都是星期天?@Edasur:我想我会选择一个不寻常的日历系统!谢谢固定的。这表明,在解析日期字符串时,日期转换过程并不关注星期几。