如何在 date 命令中使用时间戳?
在date命令中,时间戳(Unix Epoch Time,即从 1970-01-01 00:00:00 UTC 到指定时间的秒数)是核心实用功能,支持时间戳转可读时间、当前时间转时间戳、自定义格式转换等场景,以下是完整用法:
一、核心概念
- 时间戳单位:默认是秒(毫秒 / 微秒需额外拼接纳秒字段);
- 格式符
%s:用于输出时间戳(秒); - 选项
-d @<时间戳>:用于将时间戳转回可读时间(@是固定分隔符,不可省略)。
二、常用时间戳操作示例
1. 【基础】当前时间转时间戳(秒)
直接用%s格式符,输出当前系统时间对应的 Unix 时间戳(秒):
bash
运行
# 最简写法 date +%s # 示例输出:1733498125(对应 2025-12-06 11:15:25) # 带纳秒的高精度时间戳(秒.纳秒) date +"%s.%N" # 示例输出:1733498125.1234567892. 【核心】时间戳转回可读时间
用-d @<时间戳>解析时间戳,输出系统默认格式的可读时间:
bash
运行
# 示例:解析时间戳 1733498125 date -d @1733498125 # 示例输出:Sat Dec 6 11:15:25 CST 2025 # 解析高精度时间戳(自动忽略小数部分,仅取秒数) date -d @1733498125.123456789 # 输出同上(仅解析 1733498125 秒部分)3. 【实用】时间戳转自定义格式
结合-d @<时间戳>和格式符,按需求输出指定格式的时间(日志 / 脚本常用):
bash
运行
# 转「年-月-日 时:分:秒」格式 date -d @1733498125 +"%Y-%m-%d %H:%M:%S" # 输出:2025-12-06 11:15:25 # 转「年月日时分秒」紧凑格式(用于文件名) date -d @1733498125 +"%Y%m%d_%H%M%S" # 输出:20251206_111525 # 转带星期/时区的格式 date -d @1733498125 +"%Y-%m-%d %A %H:%M:%S %Z" # 输出:2025-12-06 Saturday 11:15:25 CST4. 【进阶】UTC 时区的时间戳转换
默认转换用系统时区(如 CST 中国标准时间),加-u可强制用 UTC 时区解析:
bash
运行
# 时间戳转 UTC 时间(而非本地时区) date -u -d @1733498125 +"%Y-%m-%d %H:%M:%S" # 输出:2025-12-06 03:15:25(UTC 比 CST 晚 8 小时) # 当前 UTC 时间转时间戳 date -u +%s # 输出与本地时区 `date +%s` 一致(时间戳是 UTC 统一值,与时区无关)5. 【脚本场景】计算两个时间戳的差值
通过时间戳可快速计算时间差(秒 / 分钟 / 小时 / 天),示例:
bash
运行
# 步骤1:定义两个时间戳(示例:2025-12-01 和 2025-12-06) start_ts=$(date -d "2025-12-01" +%s) # 1732982400 end_ts=$(date -d "2025-12-06" +%s) # 1733498125 # 步骤2:计算差值(秒) diff_seconds=$(( end_ts - start_ts )) # 步骤3:转换为天/小时/分钟 diff_days=$(( diff_seconds / 86400 )) # 86400秒=1天 diff_hours=$(( diff_seconds % 86400 / 3600 )) # 剩余秒数转小时 diff_minutes=$(( diff_seconds % 3600 / 60 )) # 剩余秒数转分钟 # 输出结果 echo "时间差:$diff_days 天 $diff_hours 小时 $diff_minutes 分钟" # 输出:时间差:5 天 11 小时 15 分钟6. 【扩展】指定日期转时间戳
通过-d解析任意可读日期,再转时间戳(反向转换):
bash
运行
# 指定日期转时间戳 date -d "2025-12-25 00:00:00" +%s # 输出:1735027200 # 支持自然语言日期转时间戳 date -d "yesterday" +%s # 昨天当前时间的时间戳 date -d "1 hour ago" +%s # 1小时前的时间戳 date -d "next Monday" +%s # 下周一当前时间的时间戳三、注意事项
- 时间戳单位:
date仅支持秒级时间戳解析(-d @<秒数>),若输入毫秒级时间戳(如 1733498125123),需先截取前 10 位(秒数):bash
运行
# 处理毫秒时间戳(1733498125123 → 1733498125) ms_ts=1733498125123 s_ts=${ms_ts:0:10} # 截取前10位 date -d @$s_ts +"%Y-%m-%d %H:%M:%S" - 时区无关性:时间戳本身是 UTC 统一值,转换时的时区仅影响 “可读时间的显示”,不改变时间戳数值;
- 非法时间戳:若输入超出范围的时间戳(如负数、过大值),
date会报错date: invalid date '@-1'; - 闰秒处理:时间戳会跳过闰秒(如 60 秒),无需额外处理。
四、常用时间戳转换总结表
| 需求 | 命令示例 | 示例输出 |
|---|---|---|
| 当前时间转秒级时间戳 | date +%s | 1733498125 |
| 当前时间转高精度时间戳 | date +"%s.%N" | 1733498125.123456789 |
| 时间戳转本地时区可读时间 | date -d @1733498125 | Sat Dec 6 11:15:25 CST 2025 |
| 时间戳转自定义格式 | date -d @1733498125 +"%Y-%m-%d %H:%M:%S" | 2025-12-06 11:15:25 |
| 时间戳转 UTC 时间 | date -u -d @1733498125 +"%Y-%m-%d %H:%M:%S" | 2025-12-06 03:15:25 |
| 指定日期转时间戳 | date -d "2025-12-25" +%s | 1735027200 |
