date(1) を使用して整数を曜日に変換する

date(1) を使用して整数を曜日に変換する

を使用して、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

関連情報