【问题标题】:Shell script to get difference between two dates用于获取两个日期之间差异的 Shell 脚本
【发布时间】:2011-03-24 00:52:03
【问题描述】:

如果有日期为 2010-06-01,另一个日期为 2010-05-15

使用shell脚本或日期命令如何获取两个日期之间的天数

谢谢..

【问题讨论】:

  • python -c'from datetime import date; print(date(2010, 6, 1) - date(2010, 5, 15)).days'

标签: shell date


【解决方案1】:

仅使用日期和 shell 算术:

echo $((($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s")) / 86400))

【讨论】:

  • $(()) 不需要使用两次。只需使用一组分组括号:echo $(( ( $(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s") ) / 86400))(为强调和可读性添加了可选空格)
  • 请注意,%s 特定于 GNU 日期,因此它可能在非 Linux 系统上不可用。 comp.unix.shell FAQ 对日期计算进行了长时间的讨论(基本上,除非你有 GNU 日期,否则这很难)。
  • 其实还有一个更大的问题:它有时会在春天失败……My answer explains why.
【解决方案2】:

有一个几乎可行的解决方案:使用 GNU 日期的%s 日期格式,它打印自 1970-01-01 00:00 以来的秒数。可以减去这些以找到两个日期之间的时间差。

echo $(( ($(date -d 2010-06-01 +%s) - $(date -d 2010-05-15 +%s)) / 86400))

但以下在某些位置显示为 0:

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s)) / 86400))

由于夏令时,这些时间之间只有 23 小时。您需要至少增加 1 小时(最多 23 小时)才能安全。

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s) + 43200) / 86400))

或者您可以告诉date 在没有夏令时的时区工作。

echo $((($(date -u -d 2010-03-29 +%s) - $(date -u -d 2010-03-28 +%s)) / 86400))

(POSIX 说调用参考时区是 UTC,但它也说不计算闰秒,因此在 GMT+xx 时区中,一天中的秒数始终是 86400。)

【讨论】:

  • 您的第三个示例实际上产生了82800,因为您错误地对表达式进行了分组,并且由于/ 的优先级更高,实际上添加了0,您能改正错字吗?
【解决方案3】:

OSX date 不同于 GNU date。让它在 OSX 中像这样工作。这是不可移植解决方案。

start_date=$(date -j -f "%Y-%m-%d" "2010-05-15" "+%s")
end_date=$(date -j -f "%Y-%m-%d" "2010-06-01" "+%s")

echo $(( ($end_date - $start_date) / (60 * 60 * 24) ))

想法仍然与其他答案相同。将日期转换为纪元时间,减去并将结果转换为天数。

【讨论】:

    【解决方案4】:

    知道了

                 d1=`date +%s -d $1`
                 d2=`date +%s -d $2`
                ((diff_sec=d2-d1))
             echo - | awk -v SECS=$diff_sec '{printf "Number of days : %d",SECS/(60*60*24)}'
    

    谢谢..

    【讨论】:

    • 如果你打算使用(()),你也可以使用$()而不是反引号。此外,无需将某些内容输入awk,只需使用awk ... 'BEGIN {printf ...}'。如果只是整数数学,你真的不需要使用awkecho "Number of days: $(( ( d2 - d1 ) / ( 60 * 60 * 24 ) ))"
    【解决方案5】:

    Gnu date 知道 %j 显示一年中的哪一天:

    echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j)))
    

    跨越年份会给出错误的结果,但既然你给出了固定的日期......

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多