月と年という2つの数字が与えられた場合、その月の最初の日と最後の日をどのように計算しますか?私の目標は、次の3行を出力することです。
Month/Year (月はテキスト形式ですが簡単です。)
毎月各日付:その日付は曜日の名前です:金曜日。 &土曜日。 &太陽。 [...]
月の日数:1&2&3 [...]&28&..?
date
GNUまたはBSD date
(OS X)を使用するソリューションを探しています。
答え1
# Last month:
l_first_date=$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)
l_last_date=$(date -d "`date +%Y%m01` -1 day" +%Y-%m-%d)
# This month:
t_first_date=$(date +%Y-%m-01)
t_last_date=$(date -d "`date +%Y%m01` +1 month -1 day" +%Y-%m-%d)
# Next month:
n_first_date=$(date -d "`date +%Y%m01` +1 month" +%Y-%m-%d)
n_last_date=$(date -d "`date +%Y%m01` +2 month -1 day" +%Y-%m-%d)
# Print everything
echo "Last month: $l_first_date to $l_last_date"
echo "This month: $t_first_date to $t_last_date"
echo "Next month: $n_first_date to $n_last_date"
答え2
率直に申し上げると、質問した内容を見れば宿題が少しあるようです。そのため、読者のための練習で答えにいくつかのステップを残しておきます。
date
マンページを注意深く調べることをお勧めします。具体的には、-d
特定の日付を確認できるフラグを見てください。 Y年度 M月の初日は「M/01/Y」です。
得る最後月の日、最良の方法は、与えられた月の数に1を加えてから日付から日を引くことです。
ヒント:実際には広範な算術を受け入れることが可能です。たとえば、それが私に正解を与えると言うことができますdate
。date -d "01/07/2012 + 1 month - 1 day"
date
マンページの「フォーマット」セクションを見ると、2)と3)で目的の出力を表示する方法を学ぶことができます。
ヒント:表示%a
と%d
答え3
私はしばらく前に同様の問題を経験しました。私の解決策は次のとおりです
$ ./get_dates.sh 2012 07
The first day is 01.2012.07, Sunday
The last day is 31.2012.07, Tuesday
$ cal
July 2012
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
スクリプト自体:
#!/bin/bash
# last day for month
lastday() {
# ja fe ma ap ma jn jl ag se oc no de
mlength=('xx' '31' '28' '31' '30' '31' '30' '31' '31' '30' '31' '30' '31')
year=$1
month=$2
if [ $month -ne 2 ] ; then
echo ${mlength[$month]}
return 0
fi
leap=0
((!(year%100))) && { ((!(year%400))) && leap=1 ; } || { ((!(year%4))) && leap=1 ; }
feblength=28
((leap)) && feblength=29
echo $feblength
}
# date to Julian date
date2jd() {
year=$1
month=$2
day=$3
lday=$(lastday $year $month) || exit $?
if ((day<1 || day> lday)) ; then
echo day out of range
exit 1
fi
echo $(( jd = day - 32075
+ 1461 * (year + 4800 - (14 - month)/12)/4
+ 367 * (month - 2 + (14 - month)/12*12)/12
- 3 * ((year + 4900 - (14 - month)/12)/100)/4
- 2400001 ))
}
jd2dow()
{
days=('Sunday' 'Monday' 'Tuesday' 'Wednesday' 'Thursday' 'Friday' 'Saturday')
jd=$1
if ((jd<1 || jd>782028)) ; then
echo julian day out of range
return 1
fi
((dow=(jd+3)%7))
echo ${days[dow]}
}
echo -n "The first day is 01.$1.$2, "
jd2dow $(date2jd $1 $2 01)
echo -n "The last day is $(lastday $1 $2).$1.$2, "
jd2dow $(date2jd $1 $2 $(lastday $1 $2))
必要なコンピュータにGNUがないため、date
日付で解決しません。たぶんより良い解決策があるかもしれません。
答え4
先月の開始日と終了日
month_year=$(date +'%m %Y' | awk '!--$1{$1=12;$2--}1')
m=${month_year% *}
y=${month_year##* }
d=$(cal $m $y | paste -s - | awk '{print $NF}')
first_date=$(printf '01-%02s-%s' $m $y)
last_date=$(printf '%s-%02s-%s' $d $m $y)
echo $first_date $last_date
その月の開始日と終了日
month_year=$(date +'%m %Y' | awk '!$1{$1=12;$2--}1')
m=${month_year% *}
y=${month_year##* }
d=$(cal $m $y | paste -s - | awk '{print $NF}')
first_date=$(printf '01-%02s-%s' $m $y)
last_date=$(printf '%s-%02s-%s' $d $m $y)
echo $first_date $last_date
来月の開始日と終了日
month_year=$(date +'%m %Y' | awk '!++$1{$1=12;$2--}1')
m=${month_year% *}
y=${month_year##* }
d=$(cal $m $y | paste -s - | awk '{print $NF}')
first_date=$(printf '01-%02s-%s' $m $y)
last_date=$(printf '%s-%02s-%s' $d $m $y)
echo $first_date $last_date