#!/bin/bash # days-between.sh: µÎ ³¯Â¥ »çÀÌÀÇ ³¯ ¼ö. # »ç¿ë¹ý: ./days-between.sh YYYY/[M]M/[D]D YYYY/[M]M/[D]D ARGS=2 # ¸í·É¾îÁÙ ¸Å°³º¯¼ö´Â µÎ °³ ÇÊ¿ä. E_PARAM_ERR=65 # ¸Å°³º¯¼ö ¿¡·¯. REFYR=1600 # ÂüÁ¶ ³â(Reference year). CENTURY=100 DIY=365 ADJ_DIY=367 # À±³â + fraction À» Á¶ÀýÇϱâ À§Çؼ. MIY=12 DIM=31 LEAPCYCLE=4 MAXRETVAL=256 # ÇÔ¼ö¿¡¼ ¸®ÅÏ °¡´ÉÇÑ ÃÖ´ë Á¤¼ö diff= # ³¯Â¥ °£°ÝÀ» À§ÇÑ Àü¿ª º¯¼ö ¼±¾ð. value= # Àý´ë°ªÀ» À§ÇÑ Àü¿ª º¯¼ö ¼±¾ð. day= # ³â, ¿ù, ÀÏÀ» À§ÇÑ Àü¿ª º¯¼ö ¼±¾ð. month= year= Param_Error () # Ʋ¸° ¸í·É¾îÁÙ ¸Å°³º¯¼ö. { echo "»ç¿ë¹ý: `basename $0` YYYY/[M]M/[D]D YYYY/[M]M/[D]D" echo " (1600/1/3 ÀÌÈÄÀÇ ³¯Â¥¿©¾ß ÇÕ´Ï´Ù)" exit $E_PARAM_ERR } Parse_Date () # ¸í·É¾îÁÙ ¸Å°³º¯¼ö·Î ³Ñ¾î¿Â ³¯Â¥¸¦ ÆĽÌ. { # month=${1%%/**} # dm=${1%/**} # Day and month. # day=${dm#*/} # ¿Å±äÀÌ: YYYY/MM/DD ÇüÅ·Π¹Ù²Þ. year=${1%%/**} ym=${1%/**} # ³â, ¿ù. month=${ym#*/} let "day = `basename $1`" # ÆÄÀÏÀ̸§Àº ¾Æ´ÏÁö¸¸ ¶È°°ÀÌ µ¿ÀÛÇÕ´Ï´Ù. } check_date () # ³¯Â¥ ¹üÀ§°¡ ¸Â´ÂÁö È®ÀÎ. { [ "$day" -gt "$DIM" ] || [ "$month" -gt "$MIY" ] || [ "$year" -lt "$REFYR" ] && Param_Error # Á¦´ë·Î µÈ ³¯Â¥°¡ ¾Æ´Ò °æ¿ì¿¡ ½ºÅ©¸³Æ®¸¦ Á¾·á. # "or-list / and-list" ¸¦ ½èÁÒ. # µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦: ³¯Â¥¸¦ Á» ´õ Á¤È®ÇÏ°Ô È®ÀÎÇϵµ·Ï ±¸ÇöÇØ º¸¼¼¿ä. } strip_leading_zero () # ¿ùÀ̳ª ÀÏ ¾Õ¿¡ 0 ÀÌ ÀÖÀ» °æ¿ì¿¡´Â { # Bash °¡ 8 Áø¼ö·Î Çؼ®Çϱ⠶§¹®¿¡(POSIX.2, 2.9.2.1 Àý) val=${1#0} # ±× 0 À» Àß¶ó³¾ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. return $val } day_index () # °¡¿ì½º °ø½Ä(Gauss' Formula): { # 1600³â 1¿ù 3ÀϺÎÅÍ ¸Å°³º¯¼ö·Î ³Ñ¾î¿Â ³¯Â¥±îÁö °è»ê. day=$1 month=$2 year=$3 let "month = $month - 2" if [ "$month" -le 0 ] then let "month += 12" let "year -= 1" fi let "year -= $REFYR" let "indexyr = $year / $CENTURY" let "Days = $DIY*$year + $year/$LEAPCYCLE - $indexyr + $indexyr/$LEAPCYCLE + $ADJ_DIY*$month/$MIY + $day - $DIM" # ÀÌ ¾Ë°í¸®Áò¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ´ÙÀ½À» Âü°íÇϼ¼¿ä. # http://home.t-online.de/home/berndt.schwerdtfeger/cal.htm if [ "$Days" -gt "$MAXRETVAL" ] # ÇÔ¼ö¿¡¼ 256 º¸´Ù Å« ¼ö¸¦ ¸®ÅÏÇϱâ À§Çؼ then # °á°ú°¡ 256 º¸´Ù Å©´Ù¸é À½¼ö·Î ¹Ù²Þ. let "dindex = 0 - $Days" else let "dindex = $Days" fi return $dindex } calculate_difference () # µÎ ³¯Â¥°£ Â÷À̳ª´Â ³¯ ¼ö¸¦ °è»ê. { let "diff = $1 - $2" # Àü¿ª º¯¼ö. } abs () # Àý´ë°ª { # "value" Àü¿ª º¯¼ö »ç¿ë. if [ "$1" -lt 0 ] # If À½¼ö then # then let "value = 0 - $1" # ºÎÈ£ ¹Ù²Ù±â, else # else let "value = $1" # ±×´ë·Î µÒ. fi } if [ $# -ne "$ARGS" ] # ¸í·É¾îÁÙ ¸Å°³º¯¼ö°¡ µÎ °³ ÇÊ¿ä. then Param_Error fi Parse_Date $1 check_date $day $month $year # ³¯Â¥ Çü½ÄÀÌ ¸Â´ÂÁö È®ÀÎ. strip_leading_zero $day # ÀÏÀ̳ª ¿ù ¾Õ¿¡ ºÙÀº 0 À» Á¦°Å. day=$? strip_leading_zero $month month=$? day_index $day $month $year date1=$? abs $date1 # Àý´ë°ªÀ» ±¸ÇØ È®½ÇÈ÷ ¾ç¼ö·Î ¸¸µê date1=$value Parse_Date $2 check_date $day $month $year strip_leading_zero $day day=$? strip_leading_zero $month month=$? day_index $day $month $year date2=$? abs $date2 # ¾ç¼ö·Î ¸¸µê. date2=$value calculate_difference $date1 $date2 abs $diff # ¾ç¼ö·Î ¸¸µê. diff=$value echo $diff exit 0 # http://buschencrew.hypermart.net/software/datedif # ¿¡ ÀÖ´Â °¡¿ì½º °ø½ÄÀÇ C ±¸Çö°ú ÀÌ ½ºÅ©¸³Æ®¸¦ ºñ±³ÇØ º¸¼¼¿ä.