Created
May 9, 2011 15:06
-
-
Save froop/962697 to your computer and use it in GitHub Desktop.
[bsh] 日数を加減算するユーティリティ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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