You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本如何正确解析yyyy-mm、mm/yyyy等多格式日期参数

Bash多格式日期参数解析方案

问题根因

Linux/BSD自带的date命令默认要求输入必须是包含完整年月日的合法日期,仅传入年月参数时会因为缺失日字段判定为非法值,直接调用就会抛出invalid date错误。

实现逻辑

先通过正则匹配区分4种输入格式,分场景处理:

  • 对仅含年月的2种格式,临时补一个合法日值(比如01)转成完整日期,解析出年、月后直接将日字段置空
  • 对含完整年月日的2种格式,直接沿用原有解析逻辑即可

完整脚本(适配GNU Date,Linux环境通用)

#!/bin/bash
input_date="$1"
year=""
month=""
day=""

# 匹配 yyyy-mm 格式
if [[ $input_date =~ ^[0-9]{4}-[0-9]{2}$ ]]; then
    full_date="${input_date}-01"
    year=$(date -d "$full_date" +%Y)
    month=$(date -d "$full_date" +%m)
    day=""
# 匹配 mm/yyyy 格式
elif [[ $input_date =~ ^[0-9]{2}/[0-9]{4}$ ]]; then
    mm="${input_date%/*}"
    yyyy="${input_date#*/}"
    full_date="${mm}/01/${yyyy}"
    year=$(date -d "$full_date" +%Y)
    month=$(date -d "$full_date" +%m)
    day=""
# 匹配 yyyy-mm-dd 格式
elif [[ $input_date =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
    year=$(date -d "$input_date" +%Y)
    month=$(date -d "$input_date" +%m)
    day=$(date -d "$input_date" +%d)
# 匹配 mm/dd/yy 格式
elif [[ $input_date =~ ^[0-9]{2}/[0-9]{2}/[0-9]{2}$ ]]; then
    year=$(date -d "$input_date" +%Y)
    month=$(date -d "$input_date" +%m)
    day=$(date -d "$input_date" +%d)
else
    echo "不支持的日期格式" >&2
    exit 1
fi

# 输出结果
echo "年: $year"
echo "月: $month"
echo "日: $day"

macOS环境适配

macOS自带的是BSD Date,将脚本中date -d "日期值" +%输出格式类的语句,统一替换为date -j -f "输入格式" "日期值" +%输出格式即可,示例:

# yyyy-mm格式解析替换为
year=$(date -j -f "%Y-%m-%d" "$full_date" +%Y)
month=$(date -j -f "%Y-%m-%d" "$full_date" +%m)

测试示例

给脚本加执行权限后直接测试:

chmod +x parse_date.sh

# 测试仅年月参数
./parse_date.sh 2024-05
# 输出:
# 年: 2024
# 月: 05
# 日: 

./parse_date.sh 05/2024
# 输出和上面一致

# 测试完整日期参数
./parse_date.sh 2024-05-20
# 输出日字段为20

./parse_date.sh 05/20/24
# 自动补全年为2024,日为20

内容的提问来源于stack exchange,提问作者craig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:36:05