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

관련 정보