Linux Shell 脚本中 date 命令常用用法
在运维和自动化脚本开发中,处理时间日期是高频需求。GNU coreutils 提供的 date 命令功能强大,支持格式化输出和时间算术运算。下面整理了一些实用场景和注意事项。
基础格式与当前时间
获取当前时间并指定格式是最基本的操作。注意参数顺序,通常先写格式,再写 -d 选项。
date +%Y%m%d
这会输出类似 20231027 的结果。如果需要包含时分秒:
date "+%Y-%m-%d %H:%M:%S"
时间加减运算
date 命令通过 -d 参数配合相对时间描述符进行计算。常见的描述符包括 day, month, year 等。
# 显示明天的日期
date -d "+1 day" +%Y%m%d
# 显示昨天的日期
date -d "-1 day" +%Y%m%d
# 显示上个月的第一天
date -d "last month" +%Y%m
这里有个细节:正数表示未来,负数表示过去。月份和年份的计算可能会遇到月末边界问题,例如从 1 月 31 日加一个月,结果通常是 2 月 28 日或 29 日,具体取决于系统实现。
转换特定日期格式
如果你有一个固定日期字符串,想转换成另一种格式,可以这样写:
date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
输出示例:2009/12/12 00:00.00
获取上月末日期
这是一个经典场景,也是实际业务中常用的逻辑。思路是先找到下个月的第一天,然后减去一天。
# 方法一:利用相对时间
date -d "$(date +%Y%m01) -1 day" +%Y%m%d
或者更稳健的写法,避免变量拼接带来的空格问题:
echo $(date -d "$(date +%Y%m01) -1 day" +%Y%m%d)
注意:%y 是小写两位年份,建议统一使用大写 %Y 四位年份以防跨世纪歧义。
循环遍历日期
在处理批量任务时,经常需要遍历一段时间内的所有日期。以下是一个遍历上个月每一天的示例脚本:
#!/bin/bash
nowdate=$(date +%Y%m01) # 本月第一天
startdate=$(date -d "$nowdate last month" +%Y%m%d) # 上个月第一天
enddate=$(date -d "$nowdate last day" +%Y%m%d) # 上个月最后一天
while [ "$startdate" -le "$enddate" ]; do
echo $startdate
startdate=$(date -d "$startdate +1 day" +%Y%m%d)
done
这里使用了 [ ] 来比较数字字符串,兼容性更好。另外,date 命令内部的时间解析依赖于系统 locale,建议在脚本开头设置 export LC_ALL=C 以保证行为一致。
注意事项
- 不同发行版的
date命令可能略有差异,CentOS/Ubuntu 通常基于 GNU date,但 macOS 上的 BSD date 不支持-d参数,需要使用-j -v组合。 - 涉及多行命令时,注意引号的转义,防止 Shell 提前展开变量。
- 生产环境脚本建议加上错误检查,确保日期计算没有因闰年等问题出错。

