--date 或 -d 选项是 date 命令最强大的功能之一,它能够解析和理解非常自然的日期时间描述,让时间计算和转换变得简单直观。
基本语法如下:
date --date="datestr"
# 或简写
date -d "datestr"
此选项用于显示指定的日期和时间,而不是当前系统时间。
datestr 支持多种输入格式,你可以尝试下面这些例子来了解其灵活性。
常见日期时间格式解析
无论是标准的 ISO 格式,还是带时区的格式,甚至是我们习惯的英文表述,date -d 都能轻松应对。
# 常见的日期输入格式
date -d "2026-01-12 15:30:45"
date -d "2026-01-12T15:30:45+08:00"
date -d "01/12/2026 3:30:45 PM"
date -d "Jan 12, 2026 15:30:45"
# 默认输出
Mon Jan 12 15:30:45 CST 2026
Mon Jan 12 15:30:45 CST 2026
Mon Jan 12 15:30:45 CST 2026
Mon Jan 12 15:30:45 CST 2026
你还可以使用 +FORMAT 参数来指定输出格式,这在编写脚本、生成日志文件名或格式化数据时非常有用。
# 指定输出格式为 YYYY-MM-DD HH:MM:SS
date '+%F %T' -d "2026-01-12 15:30:45"
date '+%F %T' -d "2026-01-12T15:30:45+08:00"
date '+%F %T' -d "01/12/2026 3:30:45 PM"
date '+%F %T' -d "Jan 12, 2026 15:30:45"
# 按格式输出
2026-01-12 15:30:45
2026-01-12 15:30:45
2026-01-12 15:30:45
2026-01-12 15:30:45
使用英文单词描述相对时间
date -d 的强大之处在于它能理解像“tomorrow”、“next Monday”这样的自然语言,这极大简化了相对时间的计算。
# 假设当前时间是 2026-01-12 15:46:39
date '+%F %T' # 2026-01-12 15:46:39 现在
date '+%F %T' -d "tomorrow" # 2026-01-13 15:46:39 明天
date '+%F %T' -d "yesterday" # 2026-01-11 15:46:39 昨天
date '+%F %T' -d "now" # 2026-01-12 15:46:39 当前时间
date '+%F %T' -d "today" # 2026-01-12 15:46:39 今天
date '+%F %T' -d "next Monday" # 2026-01-19 00:00:00 下周一
date '+%F %T' -d "last Friday" # 2026-01-09 00:00:00 上周五
date '+%F %T' -d "next week" # 2026-01-19 15:46:39 下周
date '+%F %T' -d "2 days ago" # 2026-01-10 15:46:39 2天前
除了日级别,小时、分钟、月、年等时间单位同样支持。
# 假设当前时间是 2026-01-12 15:51:15
date '+%F %T' # 2026-01-12 15:51:15 现在
date '+%F %T' -d "next hour" # 2026-01-12 16:51:15 1小时后
date '+%F %T' -d "2 hours" # 2026-01-12 17:51:15 2小时后
date '+%F %T' -d "5 minutes" # 2026-01-12 15:56:15 5分钟后
date '+%F %T' -d "1 month" # 2026-02-12 15:51:15 1个月后
date '+%F %T' -d "1 year" # 2027-01-12 15:51:15 1年后
你甚至可以将这些描述组合起来,形成更复杂的表达式。
# 假设当前时间是 2026-01-12 15:56:59
date '+%F %T' # 2026-01-12 15:56:59 现在
date '+%F %T' -d "next Monday 2 hours ago" # 2026-01-18 22:00:00 (下周一往前推2小时)
date '+%F %T' -d "yesterday 3:30 PM" # 2026-01-11 15:30:00 (昨天下午3点半)
date '+%F %T' -d "tomorrow 9:00 AM + 2 hours" # 2026-01-13 11:00:00 (明天上午9点再加2小时)
进行时间计算
这是 date -d 在运维脚本中的核心应用,常用于计算未来的时间点或过去的时间点。
# 当前时间基础上增加时间
date '+%F %T' # 2026-01-12 16:00:51
date '+%F %T' -d "now + 3 days" # 2026-01-15 16:00:51 (3天后)
# 在指定时间基础上减少时间
date '+%F %T' -d "2026-01-31 - 7 days" # 2026-01-24 00:00:00
date '+%F %T' -d "2026-01-31 - 1 seconds" # 2026-01-30 23:59:59
你还可以用它来计算两个日期之间的天数差,这在数据统计和报表生成中很常见。
# 计算时间差(以秒为单位再转换)
start=$(date -d "2026-01-01" +%s)
end=$(date -d "2026-01-10" +%s)
days=$(((end - start) / 86400))
echo "相差 $days 天" # 输出:相差 9 天
实用脚本示例:获取各种常用日期
对于经常需要处理周期统计(如日报、周报、月报)的开发者或运维工程师来说,下面这些命令堪称“利器”。将它们保存为脚本,可以快速获取所需的日期变量,极大提升运维脚本的编写效率。
#!/bin/bash
# 获取当前日期时间
date_time=`date '+%Y-%m-%d %H:%M:%S'`
echo "date_time: $date_time"
# 前天的日期
the_day_before_yesterday=`date -d '-2 day' '+%Y-%m-%d'`
echo "the_day_before_yesterday: $the_day_before_yesterday"
# 昨天的日期
yesterday=`date -d '-1 day' '+%Y-%m-%d'`
echo "yesterday: $yesterday"
# 今天的日期
today=`date '+%Y-%m-%d'`
echo "today: $today"
# 明天的日期
tomorrow=`date -d '1 day' '+%Y-%m-%d'`
echo "tomorrow: $tomorrow"
# 昨天所在的月份
yesterday_month=`date -d '-1 day' '+%Y-%m'`
echo "yesterday_month: $yesterday_month"
# 上个月份(通过获取本月第一天再减一天得到上个月最后一天,然后格式化为月份)
last_month=`date -d "$(date '+%Y-%m-01') -1 day" '+%Y-%m'`
echo "last_month: $last_month"
# 今天所在的月份
today_month=`date '+%Y-%m'`
echo "today_month: $today_month"
# 本月(与today_month相同)
this_month=`date '+%Y-%m'`
echo "this_month: $this_month"
# 上个月的最后一天
the_last_day_of_last_month=`date -d "$(date '+%Y-%m-01') -1 day" '+%Y-%m-%d'`
echo "the_last_day_of_last_month: $the_last_day_of_last_month"
# 下个月的第一天
the_first_day_of_next_month=`date -d "$(date '+%Y-%m-01') next month" '+%Y-%m-%d'`
echo "the_first_day_of_next_month: $the_first_day_of_next_month"
# 本月的第一天
the_first_day_of_month=`date '+%Y-%m-01'`
echo "the_first_day_of_month: $the_first_day_of_month"
# 7天前的日期
the_day_7_day_ago=`date -d "-7 day" '+%Y-%m-%d'`
echo "the_day_7_day_ago: $the_day_7_day_ago"
# 30天前的日期
the_day_30_day_ago=`date -d "-30 day" '+%Y-%m-%d'`
echo "the_day_30_day_ago: $the_day_30_day_ago"
# 60天前的日期
the_day_60_day_ago=`date -d "-60 day" '+%Y-%m-%d'`
echo "the_day_60_day_ago: $the_day_60_day_ago"
# 90天前的日期
the_day_90_day_ago=`date -d "-90 day" '+%Y-%m-%d'`
echo "the_day_90_day_ago: $the_day_90_day_ago"
# 基于2021-10-21计算的日期(向前推1天和1年)
your_date=`date -d '-1 day -1 year 2021-10-21' '+%Y-%m-%d'`
echo "your_date: $your_date"
# 上个月的第一天
last_month_first_day=`date -d "$(date +%Y%m)01 last month" '+%Y-%m-%d'`
echo "last_month_first_day: $last_month_first_day"
# 下个月的第一天
next_month_first_day=`date -d "$(date +%Y%m)01 next month" '+%Y-%m-%d'`
echo "next_month_first_day: $next_month_first_day"
运行上述脚本,你将得到如下格式的输出,所有常用的日期边界值一目了然:
date_time : 2026-01-12 16:27:29
the_day_before_yesterday : 2026-01-10
yesterday : 2026-01-11
today : 2026-01-12
tomorrow : 2026-01-13
yesterday_month : 2026-01
last_month : 2025-12
today_month : 2026-01
this_month : 2026-01
the_last_day_of_last_month : 2025-12-31
the_first_day_of_next_month : 2026-02-01
the_first_day_of_month : 2026-01-01
the_day_7_day_ago : 2026-01-05
the_day_30_day_ago : 2025-12-13
the_day_60_day_ago : 2025-11-13
the_day_90_day_ago : 2025-10-14
your_date : 2020-10-20
last_month_first_day : 2025-12-01
next_month_first_day : 2026-02-01
熟练掌握 date -d 命令,能让你在Linux系统管理和自动化任务中如虎添翼。希望这些示例能帮助你更高效地处理日期时间问题。想了解更多类似的命令行技巧和脚本实战,欢迎关注云栈社区。
参考资料
[1] Date-input-formats: https://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html