【发布时间】: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'
如果有日期为 2010-06-01,另一个日期为 2010-05-15
使用shell脚本或日期命令如何获取两个日期之间的天数
谢谢..
【问题讨论】:
python -c'from datetime import date; print(date(2010, 6, 1) - date(2010, 5, 15)).days'
仅使用日期和 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 日期,否则这很难)。
有一个几乎可行的解决方案:使用 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,您能改正错字吗?
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) ))
想法仍然与其他答案相同。将日期转换为纪元时间,减去并将结果转换为天数。
【讨论】:
知道了
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 ...}'。如果只是整数数学,你真的不需要使用awk:echo "Number of days: $(( ( d2 - d1 ) / ( 60 * 60 * 24 ) ))"
Gnu date 知道 %j 显示一年中的哪一天:
echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j)))
跨越年份会给出错误的结果,但既然你给出了固定的日期......
【讨论】: