如何在Bash脚本中从已知日期列表选取过去最近的匹配日期?
问题:从已知日期列表中匹配过去最近的日期
在Bash脚本中,$extracted_date变量存储从文件抓取的任意日期,需要和已知日期列表对比,选出过去最近的匹配日期展示。目前已将所有日期转成epoch秒用于判断先后,但还没完成选取最近日期的逻辑,且已知日期列表未来可能包含跨年度情况(比如财年)。
现有代码如下:
#!/bin/bash known_dates=( "$(date --date '1 January this year' +%s)" "$(date --date '1 April this year' +%s)" "$(date --date '1 July this year' +%s)" "$(date --date '1 October this year' +%s)" ) extracted_date='14 June 2023' extracted_time="$(date --date \"${extracted_date}\" +%s)" for time_in_seconds in ${known_dates[@]}; do if (( extracted_time >= time_in_seconds )); then echo "after $(date --date \"@${time_in_seconds}\" +'%d %B %Y')" else echo "before $(date --date \"@${time_in_seconds}\" +'%d %B %Y')" fi done
预期效果:当extracted_date='14 June 2023'时,输出1 April 2023。
解决方案
修改后的代码如下:
#!/bin/bash # 定义已知日期列表(支持跨年度,可按需添加去年/明年的日期) known_dates=( "$(date --date '1 January this year' +%s)" "$(date --date '1 April this year' +%s)" "$(date --date '1 July this year' +%s)" "$(date --date '1 October this year' +%s)" # 示例:添加跨年度日期 # "$(date --date '1 October last year' +%s)" ) extracted_date='14 June 2023' extracted_time="$(date --date "${extracted_date}" +%s)" # 初始化最近匹配日期的epoch秒变量 latest_match=0 for time_in_seconds in "${known_dates[@]}"; do # 仅筛选早于或等于提取日期的已知日期 if (( extracted_time >= time_in_seconds )); then # 更新为更晚的符合条件日期 if (( time_in_seconds > latest_match )); then latest_match=$time_in_seconds fi fi done # 输出结果,处理无匹配的情况 if (( latest_match != 0 )); then echo "$(date --date "@${latest_match}" +'%d %B %Y')" else echo "未找到符合条件的过去日期" fi
逻辑说明
- 初始化
latest_match为0,用于记录符合条件的最近日期epoch秒 - 遍历已知日期列表时,只保留早于或等于提取日期的日期
- 在符合条件的日期中,持续更新
latest_match为更晚的日期,最终得到过去最近的匹配项 - 最后将epoch秒转换为格式化日期输出,同时处理无匹配的边界情况
内容的提问来源于stack exchange,提问作者algalg
相关产品推荐
相关产品推荐

