我正在编写一个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))