Skip to content

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-8601ISO 8601 格式(date/seconds)标准日期时间
-r 文件,--reference=文件显示文件的最后修改时间看某文件何时被改
-f 文件,--file=文件每行一个日期,批量转换批量处理日期列表

2. 常用格式符(+%xxx) ​

格式符含义示例
%Y四位年2026
%y两位年26
%m月(01~12)09
%d日(01~31)30
%F完整日期 = %Y-%m-%d2026-09-30
%H时(00~23)23
%M分(00~59)28
%S秒(00~60)36
%T时间 = %H:%M:%S23:28:36
%A星期全名Wednesday
%a星期缩写Wed
%B月全名September
%b月缩写Sep
%sUnix 时间戳(秒)1727722116
%j一年中的第几天273
%u星期几(1=周一)3
%z时区偏移+0800

四、由浅入深的典型示例 ​

示例 1:默认输出 ​

bash
date
text
Wed Sep 30 23:28:36 PM +08 2026

系统默认的本地化格式,包含星期、月、日、时间、时区、年。

示例 2:只要日期(ISO 格式) ​

bash
date +%F
text
2026-09-30

%F 等价于 %Y-%m-%d,生成日志目录/文件名最常用。

示例 3:只要时间 ​

bash
date +%T
text
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 +%F
text
2026-09-29

-d 不改变系统时间,只是"换算"出描述的那天。

示例 6:计算"3 天后" ​

bash
date -d '+3 days' +%F
text
2026-10-03

支持 +3 days、-1 week、next Monday、2 hours ago 等自然语言描述。

示例 7:查某日期是星期几 ​

bash
date -d '2020-01-01' +%A
text
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 +%sUnix 时间戳
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,两系统一。

七、新手易错点 ​

  1. 格式串有空格必须加引号:date +%Y-%m-%d %H:%M:%S 不加引号会报错或只取第一段。
  2. -d 不会改系统时间:它只做换算,放心用;真正改时间是 -s。
  3. %F/%T 是大写:小写 %f/%t 是别的含义,别记混。
  4. 手动 -s 设时间会被 NTP 冲掉:开了 NTP 同步后,手动设的时间很快被校回来;要手动校就先关 NTP。
  5. 容器/虚拟机里时间不对:通常是时区或 NTP 没配,用 timedatectl status 查。
  6. date 是只读的(除 -s):日常显示和计算都安全;只有 -s 会改系统时间。

八、相关命令与文档 ​