为了账号安全,请及时绑定邮箱和手机立即绑定

如何找到两个日期之间的天数差异?

如何找到两个日期之间的天数差异?

九州编程 2019-11-15 13:08:04
A =“ 2002-20-10”B =“ 2003-22-11”如何找到两个日期之间的天数差异?
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

如果您有GNU date,它允许打印任意日期的表示形式(-d选项)。在这种情况下,将日期转换为自EPOCH以来的秒数,然后减去并除以24 * 3600。

还是您需要一种便携式方式?


查看完整回答
反对 回复 2019-11-15
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

bash方式-将日期转换为%y%m%d格式,然后可以从命令行直接执行以下操作:


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


查看完整回答
反对 回复 2019-11-15
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

小心!这里的许多bash解决方案都打破了日期范围,该日期范围跨越了夏令时开始的日期(如果适用)。这是因为$((math))构造对结果值执行了“ floor” /截断操作,仅返回整数。让我说明一下:


DST于今年3月8日在美国开始,因此我们使用一个跨越以下日期范围的日期:


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”-缺少的0.05是DST切换所损失的小时数。


那么应该如何正确完成呢?

我建议改用这个:


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

在这里,“ printf”舍入由“ bc”计算出的更准确的结果,从而为我们提供了正确的日期范围“ 6”。


编辑:在下面@ hank-schultz的评论中突出显示答案,我最近一直在使用它:


date_diff=$(( ($(date -d "2015-03-11 UTC" +%s) - $(date -d "2015-03-05 UTC" +%s) )/(60*60*24) ))

只要您总是从较晚的日期中减去较早的日期,这也应该是leap秒安全的,因为leap秒只会增加差异-截断有效地舍入为正确的结果。


查看完整回答
反对 回复 2019-11-15
  • 3 回答
  • 0 关注
  • 681 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信