在 bash 中查找日期(仅给定日期和月份)和今天之间的最小差异

  • 本文关键字:日期 之间 今天 bash 查找 bash shell
  • 更新时间 :
  • 英文 :


我正在编写一个bash脚本,它将打印用户生日的剩余周数,天数和小时数。用户只会填写他的出生日期和月份。我搜索并发现我们可以取两个日期的差异:

let DIFF=(`date +%s -d 20150108`-`date +%s -d today`)/86400
echo $DIFF

上面的脚本将打印给定日期的剩余天数。我们同样可以找到周数和小时数。
但问题是,如果用户只给出出生日期不包括年份,(这里他只给出 1 月 8 日),我如何计算出即将到来的生日和今天之间的最小差异?
例如,如果生日刚刚过去,那么我必须考虑明年的生日。

只需检查日期是否已经发生在今年,以及它是否确实附加了明年的输入。

> input="8 Feb" 
> input=$(date -d "$input" '+%d %b')
> [[ $(date -d "$input" '+%s') -lt $(date -d "$(date '+%d/%m/%y')" '+%s') ]] && input="$input $(( $(date '+%Y') + 1 ))"
> let DIFF=(`date +%s -d "$input"`-`date +%s -d today`)/86400
> echo $DIFF
360

有几个警告。 如果用户输入,则第二行从日期开始剥离年份和其他信息(时间等)。并且需要第三行中的$(date -d "$(date '+%d/%m/%y')" '+%s'),以便它仅与当前日期进行比较,而不是与时间的日期进行比较。

另一种

计算天数的方法是使用 date%j 格式代码,它返回一年中的日期数字(介于 001 和 366 之间的三位整数,包括 001 和 366)。(注意:我们在date +%j的输出前面加上1,使其成为一个不以0开头的四位数整数,以避免八进制转换。

DATE="Feb 7"
TODAY=1$(date +%j)
BDAY=1$(date +%j -d "$DATE")
if ((BDAY<TODAY)); then
  BDAY=1$(date +%j -d "$DATE "$(($(date +%Y)+1)))
fi
DAYS_TO_GO=$(($BDAY-$TODAY))

相关内容

  • 没有找到相关文章

最新更新