#! /bin/echo Source_this_file: # Wed Feb 6 12:32:34 EST 2002 # /usr/local/bin/datefuncs # Copyright 2002,2003 Chris F.A. Johnson # Released under the terms of the GNU General Public License valid_date() { order=dmy case $1 in -dmy) order=dmy; shift ;; ## default -mdy) order=mdy; shift ;; -ymd) order=ymd; shift ;; esac ofs=$IFS IFS="$IFS-./" set $* case $order in dmy) v_day=$1 v_month=$2 v_year=$3 ;; mdy) v_month=$1 v_day=$2 v_year=$3 ;; ymd) v_month=$2 v_day=$3 v_year=$1 ;; esac IFS=$ofs case $v_year in "") v_year=`date +%Y` ;; *[!0-9]*) echo "Year $v_year contains a non-numeric character" >&2 return 1 ;; esac case $v_month in ## allow non-padded months [1-9]|\ 0[1-9]|\ 1[012]) ;; *) echo "Invalid month: $v_month" >&2 return 1 ;; esac case $v_day in ## allow non-padded days [1-9]|\ 0[1-9]|\ 1[0-9]|\ 2[0-8]) ;; ## if 28 or less, day is OK [23][0-9]) days_in_month $v_month $v_year [ $day -le $_DAYS_IN_MONTH ] || { echo "Invalid day: $v_day" >&2 return 1 } ;; *) echo "Invalid day: $v_day" >&2 return 1 ;; esac } days_in_month() { ## USAGE: days_in_month [month [year]] if [ -n "$1" ] then dim_m=$1 dim_y=$2 else eval `date "+dim_m=%m dim_y=%Y"` fi case $dim_m in *9|*4|*6|11) _DAYS_IN_MONTH=30 ;; ## 30 days hath September... 1|01|3|03|*5|*7|*8|10|12) _DAYS_IN_MONTH=31 ;; 2|02) is_leap_year ${dim_y:-`date +%Y`} && _DAYS_IN_MONTH=29 || _DAYS_IN_MONTH=28 ;; esac [ ${SILENT_FUNCS:-0} -eq 1 ] || echo $_DAYS_IN_MONTH } is_leap_yr() { ## USAGE: is_leap_yr [year] isl_year=${1:-`date +%Y`} [ $(( $isl_year % 400)) -eq 0 -o \ \( $(( $isl_year % 4)) -eq 0 -a $(( $isl_year % 100)) -ne 0 \) ] && { _IS_LEAP_YEAR=1 return 0 } ||{ _IS_LEAP_YEAR=0 return 1 } } is_leap_year() { ## USAGE: is_leap_year [year] isl_year=${1:-`date +%Y`} case $isl_year 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 } monthnum() { case $1 in 1|01|[Jj][aA][nN]) _MONTHNUM=1 ;; 2|02|[Ff][Ee][Bb]) _MONTHNUM=2 ;; 3|03|[Mm][Aa][Rr]) _MONTHNUM=3 ;; 4|04|[Aa][Pp][Rr]) _MONTHNUM=4 ;; 5|05|[Mm][Aa][Yy]) _MONTHNUM=5 ;; 6|06|[Jj][Uu][Nn]) _MONTHNUM=6 ;; 7|07|[Jj][Uu][Ll]) _MONTHNUM=7 ;; 8|08|[Aa][Uu][Gg]) _MONTHNUM=8 ;; 9|09|[Ss][Ee][Pp]) _MONTHNUM=9 ;; 10|[Oo][Cc][Tt]) _MONTHNUM=10 ;; 11|[Nn][Oo][Vv]) _MONTHNUM=11 ;; 12|[Dd][Ee][Cc]) _MONTHNUM=12 ;; *) return 5 ;; esac [ ${SILENT_FUNCS:-0} -eq 1 ] || echo ${_MONTHNUM} } # monthname() { case $1 in 1|01|[Jj][aA][nN]) _MONTHNAME=January ;; 2|02|[Ff][Ee][Bb]) _MONTHNAME=February ;; 3|03|[Mm][Aa][Rr]) _MONTHNAME=March ;; 4|04|[Aa][Pp][Rr]) _MONTHNAME=April ;; 5|05|[Mm][Aa][Yy]) _MONTHNAME=May ;; 6|06|[Jj][Uu][Nn]) _MONTHNAME=June ;; 7|07|[Jj][Uu][Ll]) _MONTHNAME=July ;; 8|08|[Aa][Uu][Gg]) _MONTHNAME=August ;; 9|09|[Ss][Ee][Pp]) _MONTHNAME=September ;; 10|[Oo][Cc][Tt]) _MONTHNAME=October ;; 11|[Nn][Oo][Vv]) _MONTHNAME=November ;; 12|[Dd][Ee][Cc]) _MONTHNAME=December ;; *) return 5 ;; esac [ ${SILENT_FUNCS:-0} -eq 1 ] || echo ${_MONTHNAME} } daynum() { case $1 in 0|00|7|07|[Ss][Uu][Nn]) _DAYNUM=0 ;; 1|01|[Mm][Oo][nN]) _DAYNUM=1 ;; 2|02|[Tt][Uu][Ee]) _DAYNUM=2 ;; 3|03|[Ww][Ee][Dd]) _DAYNUM=3 ;; 4|04|[Tt][Hh][Uu]) _DAYNUM=4 ;; 5|05|[Ff][Rr][Ii]) _DAYNUM=5 ;; 6|06|[Ss][Aa][Tt]) _DAYNUM=6 ;; *) return 5 ;; esac [ ${SILENT_FUNCS:-0} -eq 1 ] || echo ${_DAYNUM} } dayname() { echo ${1%${1#???}} case ${1%${1#???}} in 0|00|7|07|[Ss][Uu][Nn]) _DAYNAME=Sunday ;; 1|01|[Mm][Oo][nN]) _DAYNAME=Monday ;; 2|02|[Tt][Uu][Ee]) _DAYNAME=Tuesday ;; 3|03|[Ww][Ee][Dd]) _DAYNAME=Wednesday ;; 4|04|[Tt][Hh][Uu]) _DAYNAME=Thursday ;; 5|05|[Ff][Rr][Ii]) _DAYNAME=Friday ;; 6|06|[Ss][Aa][Tt]) _DAYNAME=Saturday ;; *) return 5 ;; esac [ ${SILENT_FUNCS:-0} -eq 1 ] || echo ${_DAYNAME} } dayofweek() { _y=$1 _m=$2 _d=$3 case $_m in 1|5) _t=0 ;; 2|6) _t=3 ;; 3|11) _t=2 ;; 4|7) _t=5 ;; 8) _t=1 ;; 9|12) _t=4 ;; 10) _t=6 ;; esac [ $_m -lt 3 ] && _y=$(( $_y - 1 )) _DAYOFWEEK=$(( ($_y + $_y/4 - $_y/100 + $_y/400 + $_t + $_d) % 7 )) [ ${SILENT_FUNCS:-0} -eq 1 ] || echo $_DAYOFWEEK } case $BASH_VERSION in [2-9].*|[1-9][0-9].*) export -f valid_date days_in_month is_leap_yr is_leap_year export -f monthnum monthname daynum dayname dayofweek ;; esac