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

如何用Bash和Awk脚本获取上月最后一天(YYYY-MM-DD格式)

获取上个月最后一天(YYYY-MM-DD格式)的实现方案

我来帮你搞定这个需求,不管是Bash还是Awk都有简洁可靠的实现方式,下面一步步说明:

Bash 最简便的写法

其实不用手动计算年份和月份,date命令本身就支持直接获取上个月最后一天,而且能自动处理跨年的情况(比如1月运行会返回去年12月31日):

date -d "$(date +%Y-%m-01) -1 day" +%Y-%m-%d

逻辑解释:

  • date +%Y-%m-01:先拿到当前月份的第一天(比如5月运行就是2018-05-01)
  • -1 day:把这个日期减一天,自然就是上个月的最后一天
  • +%Y-%m-%d:强制输出你需要的YYYY-MM-DD格式

修正你原来的Bash代码

你的代码思路没问题,但最后输出格式没调整,还可以优化日期计算逻辑(不用手动判断每个月的天数),修改后的完整代码:

#!/bin/bash
cur_month=$(date +%m)
cur_year=$(date +%Y)
prev_month=$((cur_month - 1))

# 处理跨年情况:如果是1月,上月就是去年12月
if [ $prev_month -lt 1 ]; then
    prev_year=$((cur_year - 1))
    prev_month=12
else
    prev_year=$cur_year
fi

# 构造上月第一天,加一个月再减一天(自动算出上月最后一天),同时指定输出格式
last_day_prev=$(date -d "$prev_year-$prev_month-01 +1 month -1 day" +%Y-%m-%d)
echo $last_day_prev

这样不管是5月运行输出2018-04-30,还是1月运行输出2017-12-31,都能得到符合要求的结果。

Awk 实现方案

用Awk的时间处理函数也能轻松实现,下面给两种写法:

清晰易懂版(适合新手理解)

BEGIN {
    # 获取当前时间戳
    now = systime()
    # 提取当前年份和月份(转成数字方便计算)
    cur_year = strftime("%Y", now) + 0
    cur_month = strftime("%m", now) + 0

    # 计算上月的年份和月份
    if (cur_month == 1) {
        prev_year = cur_year - 1
        prev_month = 12
    } else {
        prev_year = cur_year
        prev_month = cur_month - 1
    }

    # 构造上月第一天的时间戳,减去一天的秒数(86400秒)得到上月最后一天
    first_day_prev = mktime(sprintf("%d %d 1 0 0 0", prev_year, prev_month))
    last_day_prev = first_day_prev - 86400

    # 格式化输出为YYYY-MM-DD
    print strftime("%Y-%m-%d", last_day_prev)
}

简洁版(一行搞定)

如果追求代码简洁,可以把所有逻辑合并:

awk 'BEGIN {print strftime("%Y-%m-%d", mktime(strftime("%Y %m 1 0 0 0")) - 86400)}'

运行方式:直接在命令行执行上面的命令,或者把代码保存成.awk文件后用awk -f script.awk运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:32