在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
相关产品推荐
相关产品推荐

