如何在Bash中基于当前日期获取上一个3月2日(CI流程适用)
用date命令实现CI流程中获取最近的3月2日
需求明确:当当前日期在当年3月2日及之后,返回当年3月2日;若当前日期在当年3月2日之前,返回上一年的3月2日。以下分两种常见date命令版本给出实现方案:
GNU date(Linux发行版通用)
直接通过日期解析和数字格式比较实现:
# 生成当年3月2日的标准格式日期 target_date=$(date -d "$(date +%Y)-03-02" +%Y-%m-%d) # 将当前日期和目标日期转为数字格式(如20240223)进行大小比较 if [[ $(date +%Y%m%d) -lt $(date -d "$target_date" +%Y%m%d) ]]; then # 当前日期早于当年3月2日,将目标日期减一年 target_date=$(date -d "$target_date -1 year" +%Y-%m-%d) fi # 输出最终结果 echo "$target_date"
BSD date(macOS/FreeBSD等系统)
BSD版本date参数逻辑与GNU不同,需通过日期字符串解析和年份计算实现:
# 获取当前年份和当前日期的数字格式 current_year=$(date +%Y) current_date_num=$(date +%Y%m%d) # 生成当年3月2日的数字格式,用于比较 mar_2_num=$(date -jf "%Y-%m-%d" "${current_year}-03-02" +%Y%m%d) # 根据日期比较结果确定最终目标日期 if [[ $current_date_num -lt $mar_2_num ]]; then last_mar_2=$(date -jf "%Y-%m-%d" "$((current_year-1))-03-02" +%Y-%m-%d) else last_mar_2=$(date -jf "%Y-%m-%d" "${current_year}-03-02" +%Y-%m-%d) fi # 输出最终结果 echo "$last_mar_2"
验证示例
- 若当前日期为
2024-02-23,执行命令后返回2023-03-02 - 若当前日期为
2024-03-23,执行命令后返回2024-03-02
内容的提问来源于stack exchange,提问作者cloudy
相关产品推荐
相关产品推荐

