Unix环境下日历技术需求:打印指定年月的日期及对应星期
在Unix环境下打印指定年月的日期及对应星期
嘿,在Unix环境下实现这个需求其实挺简单的,我给你分享几个实用的方法,从快速查看的命令到可复用的脚本都有:
方法1:用cal快速查看(简洁直观)
如果只是想快速浏览指定年月的完整日历(自带日期和星期对应关系),直接用系统自带的cal命令就够了,格式是cal <月份> <年份>。比如你要查2018年2月:
cal 2 2018
输出会是这样的:
February 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
表头就是星期几,每行对应一周的日期,一目了然。
方法2:自定义Bash脚本(逐行输出日期+星期)
如果需要每行单独显示一个日期和对应的完整星期名称,写个小脚本就很方便。这个脚本还做了基本的参数校验,同时适配Linux(GNU date)和macOS/BSD(BSD date)的差异:
创建一个名为print_dates.sh的文件,内容如下:
#!/bin/bash # 检查参数数量是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <年份> <月份>" echo "例子: $0 2018 2" exit 1 fi year=$1 month=$2 # 校验月份是否在1-12之间 if ! [[ $month =~ ^[1-9]$|^1[0-2]$ ]]; then echo "错误: 月份必须是1-12之间的数字" exit 1 fi # 校验年份是否为有效数字 if ! [[ $year =~ ^[0-9]+$ ]]; then echo "错误: 年份必须是数字" exit 1 fi # 获取当月的总天数 days=$(cal "$month" "$year" | awk 'NF>6 {print $NF}' | tail -1) # 循环打印每天的日期和星期 for day in $(seq 1 "$days"); do # 补零格式化日期(比如2变成02) formatted_day=$(printf "%02d" "$day") formatted_month=$(printf "%02d" "$month") date_str="$year-$formatted_month-$formatted_day" # 判断当前系统的date命令类型 if date --version >/dev/null 2>&1; then # Linux系统(GNU date) date -d "$date_str" +"%Y-%m-%d %A" else # macOS/BSD系统(BSD date) date -jf "%Y-%m-%d" "$date_str" +"%Y-%m-%d %A" fi done
给脚本添加执行权限:
chmod +x print_dates.sh
运行示例:
./print_dates.sh 2018 2
输出会是这样的逐行格式:
2018-02-01 Thursday 2018-02-02 Friday 2018-02-03 Saturday 2018-02-04 Sunday 2018-02-05 Monday ... 2018-02-28 Wednesday
方法3:单行命令实现(无需脚本)
如果不想写脚本,用seq、cal和date组合成单行命令也能搞定:
Linux系统(GNU date):
seq 1 $(cal 2 2018 | awk 'NF>6 {print $NF}' | tail -1) | xargs -I{} date -d "2018-02-{}" +"%Y-%m-%d %A"
macOS/BSD系统:
seq 1 $(cal 2 2018 | awk 'NF>6 {print $NF}' | tail -1) | xargs -I{} date -jf "%Y-%m-%d" "2018-02-{}" +"%Y-%m-%d %A"
这个命令的逻辑是先获取当月总天数,生成1到总天数的数字序列,再逐个传给date命令格式化输出。
内容的提问来源于stack exchange,提问作者Kharabela Bhat
相关产品推荐
相关产品推荐

