![使用 date(1) 将整数转换为星期几](https://linux22.com/image/105755/%E4%BD%BF%E7%94%A8%20date(1)%20%E5%B0%86%E6%95%B4%E6%95%B0%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%98%9F%E6%9C%9F%E5%87%A0.png)
使用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
),并且需要引号以避免 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