を使用して、date
曜日を1から7の整数に変換できます。たとえば、次のようになります。
$ date -d "Thursday" +%u
4
しかし、逆にしたい場合はどうすればいいですか?それはまるで、
$ date [options] [+format]
Thursday
日付が合っても構いませんので、他のプログラムをご利用ください。ここでは簡単に説明してください。
答え1
次の日曜日の日付を取得し、N
日数を追加し、その特定の日付の日付名を印刷できます。
getdayname () {
nextplus=$(date -d "next Sunday +$1 days")
date -d "${nextplus}" '+%A'
}
getdayname 2
などを実行しますgetdayname 7
(家庭gnu date
)。
あるいは、単に配列を使用し、たとえばdate
使用しないでください。
getdayname () {
local days=( Sunday Monday Tuesday Wednesday Thursday Friday Saturday )
printf %s\\n ${days[$1]}
}
bash
/を使用しても(インデックスとして)ksh
必要です。printf %s\\n "${days[$1-1]}"
次から始まった0
)、分割+グローブを防ぐには引用符が必要です(でも機能しますyash
)。
答え2
don_crisstiの答えによると、彼の最初の答えで間違った結果が出たので、
getdayname() {
date -d "$(( 7-$(date '+%u')+$1 )) days" '+%A'
}
答え3
POSIXly(-d
標準date
オプションではありません。利用可能な場合は実装ごとに異なることを意味します)ユーザーのロケールに日付名を付け、日曜日は0または7です。
getdayname() (
IFS=';'
set -o noglob
days=$(locale day) || exit
for day do
set -- $days $days
shift "$day" &&
printf '%s\n' "$1"
done
)
例:
$ getdayname 0 4 7
Sunday
Thursday
Sunday
$ LANG=es_VE.UTF-8 getdayname 0 4 7
domingo
jueves
domingo
GNUまたはbusybox date
(-d ...
相対日付をサポートしていません)またはast-open date
(-d ...
相対日付をサポートしていますがGNUと同じ方法ではありませんdate
)を使用してください。
getdayname() (
for day do
date -ud "1970-01-$((day + 11))" +%A
done
)
zsh
外部要件なし:
$ zmodload zsh/langinfo
$ day=0
$ printf '%s\n' $langinfo[DAY_$((day+1))]
Sunday
または:
$ zmodload zsh/datetime
$ day=0
$ TZ=UTC0 strftime %A $((86400 * (3+day)))
Sunday