#!/usr/bin/ksh93 ################################################################ function usagemsg_fromdate_k93 { print " Program: fromdate_k93 This script calculates a date forward or backward for a specified number of days from a given date. Usage: ${1##*/} [-?] [-v] [-V] [-b beginDate] [-d days] Where: '-b' = Beginning date from which to start calculation. Default value is today's date in the following numeric format: 'YYYYMMDD'. '-d' = Number of days to add or subtract from today's date. Value can be positive or negative, if negative, quote the value on the command line. Default value is '-30' days '-v' = Verbose mode '-V' = Very Verbose Mode Example: fromdate_k93 -b '20060320' -d '-30' Author: Dana French (dfrench@mtxia.com) Copyright 2006 \"AutoContent\" enabled" return 0 } ################################################################ function fromdate_k93 { typeset TRUE="0" typeset FALSE="1" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset BEGINDATE=$( date +"%Y%m%d" ) typeset DELTADAYS='-30' typeset VERSION="1.0" while getopts ":b#d#vV" OPTION do case "${OPTION}" in 'b') BEGINDATE="${OPTARG}";; 'd') DELTADAYS="${OPTARG}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') usagemsg_fromdate_k93 "${0}" && return 1;; ':') usagemsg_fromdate_k93 "${0}" && return 1;; '#') usagemsg_fromdate_k93 "${0}" && return 1;; esac done shift $(( ${OPTIND} - 1 )) (( VERBOSE == TRUE )) && print -u 2 -- "# fromdate Version.......: ${VERSION}" (( VERYVERB == TRUE )) && set -x typeset YEAR="${BEGINDATE:0:4}" typeset MON="${BEGINDATE:4:2}" typeset DAY="${BEGINDATE:6:2}" typeset DAYCNT="${DELTADAYS}" (( VERBOSE == TRUE )) && print -u 2 -- "# Beginning Date.........: ${BEGINDATE}" (( VERBOSE == TRUE )) && print -u 2 -- "# Beginning Year.........: ${YEAR}" (( VERBOSE == TRUE )) && print -u 2 -- "# Beginning Month........: ${MON}" (( VERBOSE == TRUE )) && print -u 2 -- "# Beginning Day of Month.: ${DAY}" (( VERBOSE == TRUE )) && print -u 2 -- "# Number of Days Delta...: ${DELTADAYS}" SMO=( nul jan feb mar apr may jun jul aug sep oct nov dec ) DIM=( 0 31 28 31 30 31 30 31 31 30 31 30 31 ) DIM[2]="28" ( ( (( ( YEAR % 4 ) == 0 )) && (( ( YEAR % 100 ) != 0 )) ) || (( ( YEAR % 400 ) == 0 )) ) && DIM[2]="29" (( DAY = DAY + DAYCNT )) ################################################################ #### #### Determine if the specified year is a leap year, if so #### modify the number of days in february. This must be #### done differently if subtracting days from the current #### date than for adding days. As a result two separate #### loops are used depending upon whether days are being #### added or subtracted from the current date. #### #### The following is the loop for subtracting days from #### the specified date. #### ################################################################ while (( DAY <= 0 )) do (( --MON )) while (( MON <= 0 )) do (( MON = 12 - MON )) (( YEAR = YEAR - 1 )) done (( VERBOSE == TRUE )) && print -u 2 -- "# YEAR % 4 ............: $(( YEAR % 4 ))" (( VERBOSE == TRUE )) && print -u 2 -- "# YEAR % 100 ............: $(( YEAR % 100 ))" (( VERBOSE == TRUE )) && print -u 2 -- "# YEAR % 400 ............: $(( YEAR % 400 ))" DIM[2]="28" ( ( (( ( YEAR % 4 ) == 0 )) && (( ( YEAR % 100 ) != 0 )) ) || (( ( YEAR % 400 ) == 0 )) ) && DIM[2]="29" (( DAY = ${DIM[MON]} + DAY )) done ################################################################ #### #### The following is the loop for adding days to #### the specified date. #### ################################################################ while (( DAY > ${DIM[MON]} )) do (( VERBOSE == TRUE )) && print -u 2 -- "# YEAR % 4 ............: $(( YEAR % 4 ))" (( VERBOSE == TRUE )) && print -u 2 -- "# YEAR % 100 ............: $(( YEAR % 100 ))" (( VERBOSE == TRUE )) && print -u 2 -- "# YEAR % 400 ............: $(( YEAR % 400 ))" DIM[2]="28" ( ( (( ( YEAR % 4 ) == 0 )) && (( ( YEAR % 100 ) != 0 )) ) || (( ( YEAR % 400 ) == 0 )) ) && DIM[2]="29" (( DAY = DAY - ${DIM[MON]} )) (( ++MON )) while (( MON > 12 )) do (( MON = MON - 12 )) (( YEAR = YEAR + 1 )) done done (( VERBOSE == TRUE )) && print -u 2 -- "# Days in Feb ${YEAR}.......: ${DIM[2]}" typeset -Z4 YEAR4="${YEAR}" typeset -Z2 MON2="${MON}" typeset -Z2 DAY2="${DAY}" print -- "${YEAR4}${MON2}${DAY2}" return 0 } ################################################################ fromdate_k93 "${@}"