Sophie

Sophie

distrib > Mandriva > current > x86_64 > by-pkgid > b611ea73723a8287cce23d3124a6eeea > files > 152

howto-sgml-ko-2006-5mdv2010.0.noarch.rpm

#!/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 ±¸Çö°ú ÀÌ ½ºÅ©¸³Æ®¸¦ ºñ±³ÇØ º¸¼¼¿ä.