找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2034

积分

0

好友

268

主题
发表于 昨天 04:41 | 查看: 11| 回复: 0

--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




上一篇:uBlock Origin:这款开源浏览器扩展如何显著提升你的上网速度与隐私保护
下一篇:基于Rust构建静态博客生成器:从Markdown到高性能HTML站点的实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-14 15:58 , Processed in 0.285589 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表