1.date
命令概述
date
命令用于打印或设置系统的日期和时间,能够显示当前时间,支持多种时间格式的自定义输出,可以设置系统时间(需要管理员权限)。
1.1.基本语法
date [选项]... [+格式]
date [选项] [MMDDhhmm[[CC]YY][.ss]]
- 显示当前时间:直接输入
date
即可显示当前的系统时间。 - 设置系统时间:通过
[MMDDhhmm[[CC]YY][.ss]]
格式可以设置具体的日期和时间。
1.2.date
命令的常用选项
以下是一些常用选项和参数,可以大大提高 date
命令的灵活性和实用性:
选项 | 功能描述 |
---|---|
-d, --date=STRING | 显示由 STRING 指定的时间,而不是当前时间。例如:date -d "next Monday" 。 |
-f, --file=DATEFILE | 针对 DATEFILE 文件中的每一行内容,逐行显示对应的时间(等价于多次 --date 的调用)。 |
-I, --iso-8601[=TIMESPEC] | 以 ISO-8601 格式输出时间,TIMESPEC 可选值:date (默认)、hours 、minutes 、seconds 。 |
-r, --reference=文件 | 显示指定文件的最后修改时间。例如:date -r /etc/passwd 。 |
-R, --rfc-822 | 按 RFC-822 格式显示日期(如:Mon, 07 Aug 2006 12:34:56 -0600 )。 |
-s, --set=STRING | 根据 STRING 设置系统时间(需要管理员权限)。例如:date -s "2024-12-01 12:00:00" 。 |
-u, --utc, --universal | 以 UTC(协调世界时)显示或设置时间。 |
--help | 显示帮助信息并退出。 |
--version | 显示版本信息并退出。 |
1.3.时间格式化:灵活控制输出
date
命令支持通过格式符号自定义时间和日期的输出。以下是一些常见的格式符号及其用途:
格式符号 | 描述 | 示例输出 |
---|---|---|
%% | 字面上的 % | % |
%Y | 年份(四位数) | 2024 |
%m | 月份(两位数) | 11 |
%d | 日期(两位数) | 28 |
%H | 小时(24 小时制,两位数) | 14 |
%M | 分钟(两位数) | 30 |
%S | 秒(两位数) | 45 |
%F | 完整日期(等价于 %Y-%m-%d ) | 2024-11-28 |
%T | 完整时间(等价于 %H:%M:%S ) | 14:30:45 |
%a | 星期的简写 | Thu (周四) |
%A | 星期的全称 | Thursday |
%z | 时区偏移量 | +0800 |
%Z | 时区名称 | CST (北京时间) |
2.使用示例
- 显示当前时间
date
- 自定义格式输出
date +"今天是:%Y年%m月%d日 %H:%M:%S"
- 显示未来日期
date -d "7 days"
- 从文件中读取每一行的日期字符串,解析为日期
2024-11-28
+7 days
next Monday
date -f date.txt
输出:
2024年 11月 28日 星期四 00:00:00 CST
2024年 12月 05日 星期四 13:57:41 CST
2024年 12月 02日 星期一 00:00:00 CST
- 转换 Unix 时间戳
date -d "@2147483647"
- 查看文件的最后修改时间
date -r /var/log/syslog
- 时区设置
通过环境变量TZ
设置时区:
TZ='America/New_York' date
输出纽约时间。
- 脚本中的日期标签
在脚本中生成带时间戳的文件名:
filename="backup_$(date +'%Y%m%d_%H%M%S').tar.gz"
生成结果:backup_20241128_143045.tar.gz
- 设置系统时间
需要管理员权限:
sudo date -s "2024-12-01 12:00:00"
3.date -d
选项格式
3.1. 具体日期格式
date -d
支持多种标准日期格式:
格式 | 示例 | 描述 |
---|---|---|
YYYY-MM-DD | 2024-11-28 | 年-月-日,ISO 8601 格式(推荐)。 |
MM/DD/YYYY | 11/28/2024 | 月/日/年,常见的美式格式。 |
YYYYMMDD | 20241128 | 紧凑格式,无分隔符。 |
Month DD, YYYY | November 28, 2024 | 月份全称(或简写)+ 日 + 年。 |
DD Month YYYY | 28 November 2024 | 日 + 月份全称(或简写)+ 年。 |
date -d "2024-11-28"
date -d "11/28/2024"
date -d "November 28, 2024"
3.2. 时间格式
date -d
可以指定具体的时间,支持 24 小时制或 12 小时制。
格式 | 示例 | 描述 |
---|---|---|
HH:MM | 14:30 | 24 小时制,小时和分钟。 |
HH:MM:SS | 14:30:45 | 24 小时制,小时、分钟和秒。 |
HH:MM:SS AM/PM | 02:30:45 PM | 12 小时制,带 AM/PM 标识。 |
date -d "2024-11-28 14:30"
date -d "11/28/2024 02:30:45 PM"
3.3. 相对时间描述
date -d
支持相对时间描述,允许基于当前时间前后偏移。
描述 | 示例 | 输出示例(假设当前时间为 2024-11-28) |
---|---|---|
now | date -d "now" | 当前时间 |
tomorrow | date -d "tomorrow" | 2024-11-29 |
yesterday | date -d "yesterday" | 2024-11-27 |
+N days | date -d "+7 days" | 2024-12-05(7 天后) |
-N days | date -d "-7 days" | 2024-11-21(7 天前) |
+N weeks | date -d "+2 weeks" | 2024-12-12(2 周后) |
-N weeks | date -d "-2 weeks" | 2024-11-14(2 周前) |
+N months | date -d "+3 months" | 2025-02-28(3 个月后) |
-N months | date -d "-3 months" | 2024-08-28(3 个月前) |
+N years | date -d "+1 year" | 2025-11-28(1 年后) |
-N years | date -d "-1 year" | 2023-11-28(1 年前) |
date -d "tomorrow"
date -d "+7 days"
date -d "-2 weeks"
date -d "+3 months"
3.4. 复杂的自然语言描述
date -d
支持更复杂的自然语言描述,例如时间点、下一个星期几等。
描述 | 示例 | 输出示例(假设当前时间为 2024-11-28) |
---|---|---|
next WEEKDAY | date -d "next Friday" | 2024-11-29(下一个星期五) |
last WEEKDAY | date -d "last Monday" | 2024-11-25(上一个星期一) |
WEEKDAY | date -d "Monday" | 2024-11-25(本周一,如果已过则下周一) |
HH:MM next WEEKDAY | date -d "09:00 next Friday" | 2024-11-29 09:00 |
date -d "next Friday"
date -d "last Monday"
date -d "09:00 next Friday"
3.5. Unix 时间戳
date -d
支持通过 @TIMESTAMP
格式解析 Unix 时间戳。
格式 | 示例 | 描述 |
---|---|---|
@TIMESTAMP | date -d "@2147483647" | 将 Unix 时间戳转换为日期时间。 |
date -d "@2147483647"
3.6. 混合日期和时间格式
可以结合日期和时间描述,加上相对时间偏移。
描述 | 示例 | 输出示例(假设当前时间为 2024-11-28) |
---|---|---|
YYYY-MM-DD +N days | date -d "2024-11-01 +7 days" | 2024-11-08 |
HH:MM yesterday | date -d "23:59 yesterday" | 2024-11-27 23:59 |
next WEEKDAY +N hours | date -d "next Friday +12 hours" | 2024-11-29 12:00 |
date -d "2024-11-01 +7 days"
date -d "23:59 yesterday"
date -d "next Friday +12 hours"
3.7. ISO 8601 格式
ISO 8601 是国际标准的日期和时间表示法,date -d
支持以下格式:
格式 | 示例 | 描述 |
---|---|---|
YYYY-MM-DDTHH:MM:SS | date -d "2024-11-28T14:30:45" | 标准 ISO 8601 格式。 |
YYYY-MM-DDTHH:MM:SSZ | date -d "2024-11-28T14:30:45Z" | 带 Z 表示 UTC 时间。 |
date -d "2024-11-28T14:30:45"
date -d "2024-11-28T14:30:45Z"
4.timedatectl
工具常用选项和用途
命令/选项 | 用途 | 示例 |
---|---|---|
-h , --help | 显示帮助信息。 | timedatectl --help |
--version | 显示 timedatectl 的版本信息。 | timedatectl --version |
--no-pager | 禁止将输出通过分页器显示(如 less )。 | timedatectl --no-pager status |
--no-ask-password | 禁止提示输入密码。 | timedatectl --no-ask-password set-time "2024-12-01 10:00:00" |
-H , --host=[USER@]HOST | 远程操作指定主机的时间设置(需要 ssh 权限)。 | timedatectl --host=root@192.168.1.10 status |
-M , --machine=CONTAINER | 操作本地容器的时间设置。 | timedatectl --machine=my-container status |
--adjust-system-clock | 更改 RTC 模式时调整系统时钟。 | timedatectl --adjust-system-clock set-local-rtc 1 |
status | 显示当前的时间设置,包括本地时间、UTC 时间、RTC 时间、时区和 NTP 状态。 | timedatectl status |
set-time TIME | 设置系统时间(需要管理员限)。格式为 YYYY-MM-DD HH:MM:SS 。 | timedatectl set-time "2024-12-01 10:00:00" |
set-timezone ZONE | 设置系统时区。时区名称可以通过 list-timezones 查看。 | timedatectl set-timezone Asia/Shanghai |
list-timezones | 列出所有支持的时区名称。 | timedatectl list-timezones |
set-local-rtc BOOL | 控制硬件时钟(RTC)是否使用本地时间。BOOL 为 0 表示使用 UTC,1 表示使用本地时间。 | timedatectl set-local-rtc 1 |
set-ntp BOOL | 启用或禁用 NTP(网络时间协议)同步。BOOL 为 true 表示启用,false 表示禁用。 | timedatectl set-ntp true |
5.**timedatectl**
和date
适用场景对比
功能 | date 命令 | timedatectl 工具 |
---|---|---|
显示当前时间 | ✔ 显示当前时间。 | ✔ 显示当前时间、时区、NTP 状态、RTC 配置等。 |
设置系统时间 | ✔ 支持手动设置时间。 | ✔ 支持手动设置时间。 |
格式化输出时间 | ✔ 支持多种自定义格式化输出。 | ✘ 不支持格式化输出。 |
管理时区 | ✘ 不支持时区管理,需要通过环境变量 TZ 实现。 | ✔ 支持列出和设置时区。 |
NTP 时间同步 | ✘ 不支持 NTP 配置。 | ✔ 支持启用或禁用 NTP。 |
管理硬件时钟(RTC) | ✘ 不支持 RTC 配置。 | ✔ 支持配置 RTC 是否使用本地时间或 UTC。 |
脚本中的临时操作 | ✔ 更适合在脚本中快速处理时间。 | ✘ 不适合脚本中的时间格式化任务。 |
现代系统集成 | ✘ 仅限于单独运行,功能较简单。 | ✔ 与 systemd 集成,功能全面,适合现代系统。 |
Ending