Skip to content

Instantly share code, notes, and snippets.

@froop
Created May 9, 2011 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save froop/962697 to your computer and use it in GitHub Desktop.
Save froop/962697 to your computer and use it in GitHub Desktop.
[bsh] 日数を加減算するユーティリティ
#!/bin/sh
# 月加減算(YYYYMM形式)
add_yyyymm() {
yyyymm=$1
month_add=$2
# パラメータチェック
if ! echo "$yyyymm" | egrep \
'^[0-9]{4}(0[1-9]|1[0-2])$' > /dev/null
then
echo "error yyyymm: $yyyymm" >&2
return 1
fi
if ! echo "$month_add" | egrep \
'^-?[0-9]{1,4}$' > /dev/null
then
echo "error month_add: $month_add" >&2
return 1
fi
year=`echo $yyyymm | cut -c 1-4`
month=`echo $yyyymm | cut -c 5-6`
# 月数加減算
month=`expr $month + $month_add`
# 月が1月より小さければ年減算
while test "$month" -lt 1
do
month=`expr $month + 12`
year=`expr $year - 1`
done
# 月が12月より大きければ年加算
while test "$month" -gt 12
do
month=`expr $month - 12`
year=`expr $year + 1`
done
# 結果出力
printf "%04d%02d\n" $year $month
return 0
}
# 月の日数を取得(YYYYMM形式)
get_days_of_month() {
yyyymm=$1
year=`echo $yyyymm | cut -c 1-4`
month=`echo $yyyymm | cut -c 5-6`
case $month in
01 | 03 | 05 | 07 | 08 | 10 | 12)
echo 31
;;
04 | 06 | 09 | 11)
echo 30
;;
02)
#TODO: うるう年未対応
echo 28
;;
*)
echo $1: 存在しない月 >&2
return 1
esac
return 0
}
# 日加減算(YYYYMMDD形式)
add_yyyymmdd() {
yyyymmdd=$1
day_add=$2
# パラメータチェック
if ! echo "$yyyymmdd" | egrep \
'^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$' \
> /dev/null
then
echo "error yyyymmdd: $yyyymmdd" >&2
return 1
fi
if ! echo "$day_add" | egrep \
'^-?[0-9]{1,4}$' > /dev/null
then
echo "error day_add: $day_add" >&2
return 1
fi
year_month=`echo $yyyymmdd | cut -c 1-6`
day=`echo $yyyymmdd | cut -c 7-8`
# 日数加減算
day=`expr $day + $day_add`
# 日付が1日より小さければ月減算
while test "$day" -lt 1
do
year_month=`add_yyyymm $year_month -1`
days_of_month=`get_days_of_month $year_month`
day=`expr $day + $days_of_month`
done
# 日付が当該月の日数より大きければ月加算
days_of_month=`get_days_of_month $year_month`
while test "$day" -gt $days_of_month
do
day=`expr $day - $days_of_month`
year_month=`add_yyyymm $year_month 1`
days_of_month=`get_days_of_month $year_month`
done
# 結果出力
printf "%06d%02d\n" $year_month $day
return 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment