使用 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 2getdayname 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),并且需要引号以避免 split+glob (也适用于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

相关内容