date 是 Linux 處理日期時間的瑞士刀,不僅能顯示/設定系統時間,更支援豐富格式化輸出、RFC 標準、時區轉換、epoch 時間戳、腳本變數嵌入、備份檔名日期化。本文系統整理核心參數、格式化代碼速查表、實戰範例 (腳本、備份、日誌、定時任務)、硬體時鐘同步、NTP 整合。
核心參數速查
| 參數 | 功能 | 範例 |
| (無參數) | 顯示當前系統時間 (本地時區) | date → Mon Jan 15 10:30:45 CST 2024 |
-u / --utc / --universal顯示/設定 UTC 時間 | date -u → Mon Jan 15 02:30:45 UTC 2024 |
-R / --rfc-emailRFC 2822/5322 郵件標準格式 | date -R → Mon, 15 Jan 2024 10:30:45 +0800 |
-I / --iso-8601[=TIMESPEC]ISO 8601 格式 | date -I → 2024-01-15、date -Iseconds → 2024-01-15T10:30:45+08:00 |
-d STRING / --date=STRING解析字串顯示時間 (不改系統時間) | date -d "yesterday"、date -d "2 days ago"、date -d "next Friday"、date -d "@1705285845" (epoch) |
-s STRING / --set=STRING設定系統時間 (需 root) | date -s "2024-01-15 10:30:00" |
-f FILE / --file=FILE從檔案逐行解析日期字串 | date -f dates.txt |
+FORMAT自訂格式化輸出 (核心功能) | date +"%Y-%m-%d %H:%M:%S" |
--reference=FILE / -r FILE顯示檔案最後修改時間 | date -r /etc/passwd |
格式化代碼完整速查表
| 代碼 | 含義 | 範例 |
%% | 字面 % | % |
%Y | 年 (4 位) | 2024 |
%y | 年 (2 位) | 24 |
%m | 月 (01-12) | 01 |
%b / %h | 月縮寫 (Jan-Dec) | Jan |
%B | 月全名 (January-December) | January |
%d | 日 (01-31) | 15 |
%e | 日 (1-31, 空白補齊) | 15 |
%H | 時 (00-23) | 10 |
%I | 時 (01-12) | 10 |
%M | 分 (00-59) | 30 |
%S | 秒 (00-59) | 45 |
%N | 奈秒 (000000000-999999999) | 123456789 |
%s | Unix epoch 秒 (自 1970-01-01 UTC) | 1705285845 |
%z | 時區數值 (+HHMM/-HHMM) | +0800 |
%Z | 時區縮寫 (CST, UTC, PDT...) | CST |
%a | 星期縮寫 (Mon-Sun) | Mon |
%A | 星期全名 (Monday-Sunday) | Monday |
%u | 星期 (1-7, 1=Mon) | 1 |
%w | 星期 (0-6, 0=Sun) | 1 |
%j | 年間第幾天 (001-366) | 015 |
%V | ISO 週號 (01-53) | 03 |
%W | 週號 (00-53, 週一為第一天) | 02 |
%c | 本地日期時間標準格式 | Mon Jan 15 10:30:45 2024 |
%D | %m/%d/%y | 01/15/24 |
%F | %Y-%m-%d (ISO 日期) | 2024-01-15 |
%T | %H:%M:%S (ISO 時間) | 10:30:45 |
%R | %H:%M | 10:30 |
%r | 12小時制時間 (hh:mm:ss AM/PM) | 10:30:45 AM |
%X | 本地時間標準格式 | 10:30:45 |
%x | 本地日期標準格式 | 01/15/24 |
%n | 換行 | - |
%t | Tab | - |
實戰範例集
1. 常用格式化輸出
# 標準日誌時間戳
date +"%Y-%m-%d %H:%M:%S" # 2024-01-15 10:30:45
date +"%F %T" # 同上
# 檔名安全日期 (無特殊字元)
date +"%Y%m%d" # 20240115
date +"%Y%m%d_%H%M%S" # 20240115_103045
# RFC 3339 / ISO 8601 完整
date --rfc-3339=seconds # 2024-01-15 10:30:45+08:00
date -Iseconds # 2024-01-15T10:30:45+08:00
# 人類易讀
date +"%A, %B %d, %Y %I:%M %p %Z" # Monday, January 15, 2024 10:30 AM CST
2. 日期運算 (相對時間)
date -d "yesterday" # 昨天
date -d "tomorrow" # 明天
date -d "last Monday" # 上週一
date -d "next Friday" # 下週五
date -d "2 weeks ago" # 兩週前
date -d "3 months" # 3 個月後
date -d "1 year ago 10:00" # 去年今日 10:00
date -d "@$(($(date +%s) - 86400))" # 24 小時前 (epoch 運算)
3. 腳本應用:變數嵌入、日誌、備份命名
#!/bin/bash
# 1. 變數捕獲
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
DATE_ONLY=$(date +"%F")
EPOCH=$(date +%s)
# 2. 結構化日誌
log() {
echo "[$(date -Iseconds)] [$1] $2" | tee -a /var/log/myapp.log
}
log "INFO" "Service started"
# 3. 備份檔名含日期
tar -czf "/backup/app_$(date +%F).tar.gz" /var/www/app
# 4. 保留 N 天備份
find /backup -name "app_*.tar.gz" -mtime +30 -delete
# 5. 定時任務執行時間記錄
echo "$(date -Iseconds) cron job executed" >> /var/log/cron.log
4. 系統時間設定與同步
# 手動設定 (需 root)
sudo date -s "2024-01-15 10:30:00"
sudo date -s "15 Jan 2024 10:30:00"
# 硬體時鐘 (RTC) 操作
sudo hwclock --show # 顯示 RTC 時間
sudo hwclock --systohc # 系統時間 → RTC (關機前自動執行)
sudo hwclock --hctosys # RTC → 系統時間 (開機早期自動執行)
sudo hwclock --adjust # 依 /etc/adjtime 修正漂移
# 時區設定
timedatectl list-timezones | grep Taipei
sudo timedatectl set-timezone Asia/Taipei
# NTP 同步 (systemd-timesyncd / chrony / ntpd)
timedatectl status # 查看 NTP 狀態
sudo timedatectl set-ntp true # 啟用 systemd-timesyncd
# 或安裝 chrony (精度更高、支援離線)
sudo dnf/apt install chrony
sudo systemctl enable --now chronyd
chronyc sources -v # 查看來源
5. 進階:解析任意日期字串、epoch 轉換
# 字串解析 (支援自然語言)
date -d "2024-01-15 10:30:45"
date -d "15 Jan 2024"
date -d "Jan 15, 2024"
date -d "10:30:45"
date -d "now + 3 hours"
# Epoch 雙向轉換
date +%s # 當前 epoch 秒
date -d "@1705285845" # epoch → 人類時間
date -d "@$(($(date +%s) + 3600))" # 1 小時後
# 奈秒精度 (需 date 核心支援)
date +"%s.%N" # 秒.奈秒
date -d "@1705285845.123456789" # 含奈秒 epoch
常見陷阱與避坑
| 陷阱 | 原因 | 對策 |
| 格式字串未加引號 | date +%Y-%m-%d 被 shell 展開 | 永遠用單引號 date '+%Y-%m-%d' 或雙引號 |
| 設定時間權限不足 | 非 root 執行 date -s | sudo date -s ... 或設定 NTP 自動同步 |
| 時區不一致導致日誌亂序 | 伺服器時區不同、容器未傳遞 TZ | 統一設定 UTC 或明確時區,容器 -e TZ=Asia/Taipei |
| 硬體時鐘模式衝突 | RTC 存 UTC vs 本地時間 | 現代 Linux 預設 UTC,timedatectl set-local-rtc 0 |
%N 奈秒在舊版 date 不支援 | coreutils < 8.21 | 用 date +%s%3N (毫秒) 或 Perl/Python 替代 |
date vs printf vs bash 內建
# bash 5.0+ 內建 printf 格式化 (快、無外部進程)
printf '%(%Y-%m-%d %H:%M:%S)T\n' -1 # -1 = 當前時間
printf '%(%s)T\n' -1 # epoch
# 但功能較 date 簡單 (無時區、無自然語言解析)
熟練 date 的格式化代碼、相對時間解析、epoch 轉換、腳本嵌入、硬體時鐘/NTP 整合,讓時間處理從「每次查 man」進化為「手到擒來」,無論是日誌時間戳、備份輪替、定時任務、跨時區協作,皆能精準掌控。