# Tue Jan 6 16:54:02 EST 2004 # NAME: days-between # Copyright 2004, Chris F.A. Johnson # Released under the terms of the GNU General Public License DMY=${DMY:-123} dmy2jd() { parse_date $* check_date || usage "???" ## forumla from jd=$(( ( 1461 * ( $y + 4800 + ( $m - 14 ) / 12 ) ) / 4 + ( 367 * ( $m - 2 - 12 * ( ( $m - 14 ) / 12 ) ) ) / 12 - ( 3 * ( ( $y + 4900 + ( $m - 14 ) / 12 ) / 100 ) ) / 4 + $d - 32075 )) } usage() { echo "Usage: ${0##*/} [D]D/[M]M/YYYY [D]D/[M]M/[-]YYYY" echo " $*" exit 5 } check_date() { days_in_month && [ $y -ge -4800 ] && [ $d -ge 1 ] && [ $d -le $_DAYS_IN_MONTH ] } days_in_month() { case ${m#0} in 9|4|6|11) _DAYS_IN_MONTH=30 ;; ## 30 days hath September... 1|3|5|7|8|10|12) _DAYS_IN_MONTH=31 ;; 2) is_leap_year ${y:-`date +%Y`} && _DAYS_IN_MONTH=29 || _DAYS_IN_MONTH=28 ;; *) _DAYS_IN_MONTH=0 return 1 ;; esac } is_leap_year() { y=${1:-`date +%Y`} case $y in *0[48] |\ *[2468][048] |\ *[13579][26] |\ *[13579][26]0|\ *[2468][048]00 |\ *[13579][26]00 ) _IS_LEAP_YEAR=1 return 0 ;; *) _IS_LEAP_YEAR=0 return 1 ;; esac } parse_date() { dt="$*" f1=${dt%%[!0-9]*} f2=${dt%[!0-9]*} f2=${f2#*[!0-9]} f3=${dt##*[!0-9]} case ${DMY:=123} in 123|dmy) d=${f1#0}; m=${f2#0}; y=$f3 ;; 213|mdy) d=${f2#0}; m=${f1#0}; y=$f3 ;; 321|ymd) d=${f3#0}; m=${f2#0}; y=$f1 ;; 312|myd) d=${f3#0}; m=${f1#0}; y=$f2 ;; 132|dym) d=${f1#0}; m=${f3#0}; y=$f2 ;; 231|ydm) d=${f2#0}; m=${f3#0}; y=$f1 ;; *) return 1 ;; esac } [ $# -ne 2 ] && usage "Requires 2 arguments" dmy2jd $1 # ${1//[!0-9-]/ } jd1=$jd dmy2jd $2 #${2//[!0-9-]/ } diff=$(( $jd - $jd1 )) echo ${diff#-}