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

在Bash中使用date函数解析年、月的问题

问题描述

我编写了以下代码,尝试仅解析给定年份和月份的日期:

input_date="2023-08"

formatted_date=$(date -d "$input_date-01" +%Y-%m)

echo "Year: $(date -d "$formatted_date" +%Y)"

echo "Month: $(date -d "$formatted_date" +%m)"

预期输出为:

Year: 2023

Month: 08

但实际返回错误:date: invalid date '2023-08'。

我知道可以添加"-01"补全日,但我的使用场景需要支持用户输入YYYY-MM或YYYY-MM-DD格式,并通过date函数解析。需要YYYY-MM格式是为了在搜索时使用通配符模式。请问在Bash中是否有简便的实现方式?

解决方案

方法一:直接截取年月部分补全日(最简便)

不管输入是YYYY-MM还是YYYY-MM-DD,前7个字符必然是YYYY-MM格式,直接截取后补-01即可让date正确解析:

input_date="2023-08"  # 可替换为"2023-08-15"测试

# 截取前7位得到年月,补全日部分
base_date="${input_date:0:7}-01"

# 提取年份和月份
year=$(date -d "$base_date" +%Y)
month=$(date -d "$base_date" +%m)

# 输出结果
echo "Year: $year"
echo "Month: $month"

# 生成用于搜索的YYYY-MM格式
search_pattern="${year}-${month}"
echo "Search pattern: $search_pattern"

方法二:格式判断后处理

如果需要严格区分输入格式,可以先统计分隔符数量来判断,再针对性补全日:

input_date="2023-08"  # 可替换为"2023-08-15"测试

# 统计输入中"-"的数量
dash_count=$(grep -o "-" <<< "$input_date" | wc -l)
if [ $dash_count -eq 1 ]; then
    # 仅年月格式,补全日
    parsed_date="${input_date}-01"
else
    # 完整日期格式,直接使用
    parsed_date="$input_date"
fi

# 解析并输出
year=$(date -d "$parsed_date" +%Y)
month=$(date -d "$parsed_date" +%m)
echo "Year: $year"
echo "Month: $month"
echo "Search pattern: ${year}-${month}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:46:14