linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > linux命令date

Linux命令date全面介绍

作者:WangLanguager

date命令在Linux中用于显示和设置系统的日期和时间,它可以以多种方式被使用,包括显示当前的日期和时间,设置新的日期和时间,以及进行日期和时间的计算,下面是date命令的一些基本用法和详细介绍,感兴趣的朋友一起看看吧

date命令详细介绍

date 是 Linux 系统中用于显示 / 设置系统日期和时间的核心命令,支持自定义时间格式输出、时间戳转换、时区调整等,是脚本编写、日志记录、系统运维中最常用的工具之一。

一、命令基本信息

说明
作用显示当前系统时间 / 日期,或设置系统时间(需 root 权限),支持格式定制、时间戳转换
归属包核心工具包(coreutils),所有 Linux 发行版默认安装
权限要求显示时间:普通用户即可;设置时间:仅 root/sudo 权限
语法date [选项] [+格式字符串](显示时间)date [选项] 时间字符串(设置时间)

二、核心概念

  1. 系统时间 vs 硬件时间
    • date 操作的是系统时间(内核维护的时间);
    • 硬件时间(BIOS/CMOS 时间)需用 hwclock 管理,可通过 hwclock -s(硬件同步到系统)/hwclock -w(系统同步到硬件)关联。
  2. 时间戳:Unix 时间戳(Epoch Time),指从 1970-01-01 00:00:00 UTC 到当前的秒数(毫秒 / 微秒需额外参数)。
  3. 时区:默认使用系统时区(/etc/localtime 指向的时区文件),可通过 TZ 环境变量临时调整。

三、常用选项

1. 基础选项(显示 / 设置)

选项说明
-d, --date=STRING显示指定时间字符串对应的时间(不修改系统时间),支持自然语言(如 yesterday
-s, --set=STRING设置系统时间为指定字符串(需 root,如 date -s "2025-12-06 10:00:00"
-u, --utc, --universal显示 / 设置 UTC 时间(世界协调时间)
-R, --rfc-2822按 RFC 2822 格式输出(如 Sat, 06 Dec 2025 10:00:00 +0800
-I[TIMESPEC]按 ISO 8601 格式输出,TIMESPEC 可选 date/hours/minutes/seconds(如 -I 等价于 -Idate,输出 2025-12-06
--help显示帮助信息
--version显示版本信息

2. 格式控制符(核心,需加+前缀)

date 最常用的功能是通过格式字符串定制输出,格式符以 % 开头,常用如下:

格式符说明示例
%Y4 位年份2025
%y2 位年份25
%m2 位月份(01-12)12
%d2 位日期(01-31)06
%H24 小时制小时(00-23)10
%I12 小时制小时(01-12)10
%M分钟(00-59)05
%S秒(00-60,60 为闰秒)30
%sUnix 时间戳(秒)1733493930
%N纳秒(000000000-999999999)123456789
%A星期全称Saturday
%a星期缩写Sat
%B月份全称December
%b月份缩写Dec
%Z时区缩写CST(中国标准时间)
%z时区偏移(±HHMM)+0800
%F等价于 % Y-% m-% d(ISO 日期)2025-12-06
%T等价于 % H:% M:% S(24 小时制时间)10:05:30
%c系统默认的日期时间格式Sat Dec 6 10:05:30 2025

四、典型用法示例

1. 基础显示(默认格式)

# 示例输出:Sat Dec  6 10:05:30 CST 2025

2. 自定义格式输出(高频)

# 1. 按「年-月-日 时:分:秒」输出
date +"%Y-%m-%d %H:%M:%S"
# 输出:2025-12-06 10:05:30
# 2. 简化版(%F=%Y-%m-%d,%T=%H:%M:%S)
date +"%F %T"
# 输出:2025-12-06 10:05:30
# 3. 带星期和时区
date +"%Y-%m-%d %A %H:%M:%S %Z"
# 输出:2025-12-06 Saturday 10:05:30 CST
# 4. 仅显示日期
date +%F
# 输出:2025-12-06
# 5. 仅显示时间
date +%T
# 输出:10:05:30

3. 时间戳转换(核心实用功能)

# 1. 当前时间转时间戳(秒)
date +%s
# 输出:1733493930
# 2. 时间戳转回可读时间(示例:1733493930)
date -d @1733493930
# 输出:Sat Dec  6 10:05:30 CST 2025
# 3. 时间戳转自定义格式
date -d @1733493930 +"%Y-%m-%d %H:%M:%S"
# 输出:2025-12-06 10:05:30
# 4. 带毫秒的时间戳(需组合 %s 和 %N)
date +"%s.%N"
# 输出:1733493930.123456789

4. 显示相对时间(自然语言解析)

-d 选项支持自然语言描述的时间,无需手动计算,适合脚本:

# 1. 昨天的时间
date -d "yesterday" +"%F %T"
# 输出:2025-12-05 10:05:30
# 2. 明天的时间
date -d "tomorrow" +"%F %T"
# 输出:2025-12-07 10:05:30
# 3. 1小时前
date -d "1 hour ago" +"%F %T"
# 输出:2025-12-06 09:05:30
# 4. 3天后
date -d "3 days later" +"%F %T"
# 输出:2025-12-09 10:05:30
# 5. 指定日期的下周一
date -d "2025-12-06 next Monday" +"%F"
# 输出:2025-12-08
# 6. 上个月的今天
date -d "last month" +"%F"
# 输出:2025-11-06

5. 时区切换

# 1. 临时切换为 UTC 时间(仅当前命令生效)
date -u
# 输出:Sat Dec  6 02:05:30 UTC 2025
# 2. 切换为纽约时区(EST)
TZ="America/New_York" date
# 输出:Sat Dec  6 01:05:30 EST 2025
# 3. 列出系统支持的时区:ls /usr/share/zoneinfo/

6. 设置系统时间(需 root)

# 1. 设置为指定日期时间
sudo date -s "2025-12-06 10:00:00"
# 2. 仅设置日期(时间不变)
sudo date -s "2025-12-06"
# 3. 仅设置时间(日期不变)
sudo date -s "10:00:00"
# 4. 设置后同步到硬件时间(避免重启失效)
sudo hwclock -w

7. 按 RFC/ISO 标准输出

# RFC 2822 格式(邮件/日志常用)
date -R
# 输出:Sat, 06 Dec 2025 10:05:30 +0800
# ISO 8601 格式(含秒)
date -Iseconds
# 输出:2025-12-06T10:05:30+08:00

五、高级场景(脚本 / 运维)

1. 生成带时间戳的日志文件名

# 创建格式为「log_20251206_100530.txt」的文件
touch log_$(date +%Y%m%d_%H%M%S).txt

2. 计算两个时间的差值(秒)

# 示例:计算「2025-12-06」与「2025-12-01」的天数差(转秒后除以86400)
start=$(date -d "2025-12-01" +%s)
end=$(date -d "2025-12-06" +%s)
diff=$(( (end - start) / 86400 ))
echo "差值:$diff 天"
# 输出:差值:5 天

3. 定时任务中记录执行时间

# 脚本中记录开始/结束时间
echo "任务开始时间:$(date +"%F %T")"
# 执行任务...
echo "任务结束时间:$(date +"%F %T")"

六、注意事项

  1. 权限限制:设置系统时间必须用 root 或 sudo,普通用户执行 date -s 会报错 date: cannot set date: Operation not permitted
  2. 时区配置:系统默认时区由 /etc/localtime 软链接控制(如指向 /usr/share/zoneinfo/Asia/Shanghai),可通过 timedatectl set-timezone Asia/Shanghai 永久修改;
  3. 闰秒处理%S 可能输出 60(闰秒),脚本中需注意数值范围;
  4. 时间同步:生产环境不建议手动改时间,推荐用 ntpdate 或 chronyd 同步网络时间(如 sudo ntpdate pool.ntp.org);
  5. 自然语言兼容-d 支持的自然语言(如 yesterday/next week)依赖系统语言(LANG),建议设置 LANG=en_US.UTF-8 避免解析失败。

七、相关命令

到此这篇关于Linux命令date 详细介绍的文章就介绍到这了,更多相关linux命令date 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文