主题
date 命令详解:显示、设置和计算日期时间
本文是 Linux 命令速查 中
date的从 0 到 1 详解。 目标:把date的格式符、-d时间计算、-s设置时间讲清楚,多看几遍后,你在服务器上敲date +%F就知道怎么取想要的时间格式。 环境依据:GNU coreutils 8.32(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。
一、命令是干什么的
date 用来显示和设置系统时间,还能做时间计算("昨天是几号"、"3 天后是周几")。写脚本生成带时间戳的日志文件、判断某个日期是周几,都靠它。
- 不带参数:按默认格式打印当前时间;
- 带
+格式:按你指定的格式输出(如+%F就是2026-09-30); - 带
-d "描述":计算某个时间点而不是"现在"; - 带
-s "时间":设置系统时间(需 root)。
类比:
date像一个全能的"电子表+日历计算器",既能看现在几点,也能换算任意日期。
二、命令语法
bash
# 显示
date [选项]... [+FORMAT]
# 设置
date [-u|--utc] [MMDDhhmm[[CC]YY][.ss]]+FORMAT:以+开头、后面跟格式符(如+%Y-%m-%d);-d 字符串:显示"字符串描述的时间",而不是现在;-s 字符串:把系统时间设成"字符串描述的时间"。
最简单的用法:
bash
date三、选项全表(对照 date --help)
1. 常用选项
| 选项 | 中文含义 | 什么场景用 |
|---|---|---|
+格式 | 按格式输出 | 生成时间戳(最常用) |
-d 字符串,--date=字符串 | 显示字符串描述的时间,而非现在 | 时间计算(昨天、3 天后) |
-s 字符串,--set=字符串 | 把系统时间设成字符串描述的时间 | 手动校时(需 root) |
-u,--utc | 显示/设置 UTC 时间 | 跨时区服务统一用 UTC |
-I[格式],--iso-8601 | ISO 8601 格式(date/seconds) | 标准日期时间 |
-r 文件,--reference=文件 | 显示文件的最后修改时间 | 看某文件何时被改 |
-f 文件,--file=文件 | 每行一个日期,批量转换 | 批量处理日期列表 |
2. 常用格式符(+%xxx)
| 格式符 | 含义 | 示例 |
|---|---|---|
%Y | 四位年 | 2026 |
%y | 两位年 | 26 |
%m | 月(01~12) | 09 |
%d | 日(01~31) | 30 |
%F | 完整日期 = %Y-%m-%d | 2026-09-30 |
%H | 时(00~23) | 23 |
%M | 分(00~59) | 28 |
%S | 秒(00~60) | 36 |
%T | 时间 = %H:%M:%S | 23:28:36 |
%A | 星期全名 | Wednesday |
%a | 星期缩写 | Wed |
%B | 月全名 | September |
%b | 月缩写 | Sep |
%s | Unix 时间戳(秒) | 1727722116 |
%j | 一年中的第几天 | 273 |
%u | 星期几(1=周一) | 3 |
%z | 时区偏移 | +0800 |
四、由浅入深的典型示例
示例 1:默认输出
bash
datetext
Wed Sep 30 23:28:36 PM +08 2026系统默认的本地化格式,包含星期、月、日、时间、时区、年。
示例 2:只要日期(ISO 格式)
bash
date +%Ftext
2026-09-30
%F等价于%Y-%m-%d,生成日志目录/文件名最常用。
示例 3:只要时间
bash
date +%Ttext
23:28:36
%T等价于%H:%M:%S。
示例 4:自定义"年月日 时分秒"
bash
date '+%Y-%m-%d %H:%M:%S'text
2026-09-30 23:28:36格式串里有空格,要加引号。脚本里生成时间戳就是这个。
示例 5:计算"昨天"
bash
date -d yesterday +%Ftext
2026-09-29
-d不改变系统时间,只是"换算"出描述的那天。
示例 6:计算"3 天后"
bash
date -d '+3 days' +%Ftext
2026-10-03支持
+3 days、-1 week、next Monday、2 hours ago等自然语言描述。
示例 7:查某日期是星期几
bash
date -d '2020-01-01' +%Atext
Wednesday想知道历史/未来某天周几,直接
-d指定日期再+%A。
示例 8:Unix 时间戳与时间互转
bash
# 现在的 Unix 时间戳
date +%s
# 把时间戳转回可读时间
date -d @1727722116 '+%F %T'
%s输出秒数;-d @秒数把秒数转回日期。脚本里常用。
示例 9:手动设置系统时间(需 root)
bash
sudo date -s '2026-09-30 23:30:00'一般不手动设时间,用
timedatectl set-ntp true让 NTP 自动同步更可靠(见 time-sync)。
五、高频组合速记
| 命令 | 用途 |
|---|---|
date +%F | 当前日期(2026-09-30) |
date +%T | 当前时间(23:28:36) |
date '+%Y-%m-%d %H:%M:%S' | 完整时间戳(最常用) |
date +%s | Unix 时间戳 |
date -d yesterday +%F | 昨天日期 |
date -d '+3 days' +%F | 几天后 |
date -d '2020-01-01' +%A | 某日期周几 |
date -u '+%F %T' | UTC 时间 |
六、RHEL 系与 Debian 系差异
date 属于 GNU coreutils,两系用法完全一致。细微差别:
- 默认输出的本地化语言取决于 locale(
LANG),中文 locale 下月份/星期可能是中文; - RHEL 系默认时区一般为 UTC,Debian/Ubuntu 装系统时会让你选时区;改时区用
timedatectl set-timezone,两系统一。
七、新手易错点
- 格式串有空格必须加引号:
date +%Y-%m-%d %H:%M:%S不加引号会报错或只取第一段。 -d不会改系统时间:它只做换算,放心用;真正改时间是-s。%F/%T是大写:小写%f/%t是别的含义,别记混。- 手动
-s设时间会被 NTP 冲掉:开了 NTP 同步后,手动设的时间很快被校回来;要手动校就先关 NTP。 - 容器/虚拟机里时间不对:通常是时区或 NTP 没配,用
timedatectl status查。 date是只读的(除-s):日常显示和计算都安全;只有-s会改系统时间。
八、相关命令与文档
- 速查页:Linux 命令速查
- 时区与 NTP 同步:
timedatectl、chronyc(详解见 time-sync) - 定时任务:
crontab(详解见 crontab) - 时间专题:见 Linux 定时任务