Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux date 指令完全指南:顯示、格式化、設定時間、腳本應用與備份命名實戰

編輯:關於 Linux

date 是 Linux 處理日期時間的瑞士刀,不僅能顯示/設定系統時間,更支援豐富格式化輸出、RFC 標準、時區轉換、epoch 時間戳、腳本變數嵌入、備份檔名日期化。本文系統整理核心參數、格式化代碼速查表、實戰範例 (腳本、備份、日誌、定時任務)、硬體時鐘同步、NTP 整合。

核心參數速查

-u / --utc / --universal-R / --rfc-email-I / --iso-8601[=TIMESPEC]-d STRING / --date=STRING-s STRING / --set=STRING-f FILE / --file=FILE+FORMAT--reference=FILE / -r FILE
參數功能範例
(無參數)顯示當前系統時間 (本地時區)date → Mon Jan 15 10:30:45 CST 2024
顯示/設定 UTC 時間date -u → Mon Jan 15 02:30:45 UTC 2024
RFC 2822/5322 郵件標準格式date -R → Mon, 15 Jan 2024 10:30:45 +0800
ISO 8601 格式date -I → 2024-01-15、date -Iseconds → 2024-01-15T10:30:45+08:00
解析字串顯示時間 (不改系統時間)date -d "yesterday"、date -d "2 days ago"、date -d "next Friday"、date -d "@1705285845" (epoch)
設定系統時間 (需 root)date -s "2024-01-15 10:30:00"
從檔案逐行解析日期字串date -f dates.txt
自訂格式化輸出 (核心功能)date +"%Y-%m-%d %H:%M:%S"
顯示檔案最後修改時間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
%sUnix 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
%VISO 週號 (01-53)03
%W週號 (00-53, 週一為第一天)02
%c本地日期時間標準格式Mon Jan 15 10:30:45 2024
%D%m/%d/%y01/15/24
%F%Y-%m-%d (ISO 日期)2024-01-15
%T%H:%M:%S (ISO 時間)10:30:45
%R%H:%M10:30
%r12小時制時間 (hh:mm:ss AM/PM)10:30:45 AM
%X本地時間標準格式10:30:45
%x本地日期標準格式01/15/24
%n換行-
%tTab-

實戰範例集

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 -ssudo 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」進化為「手到擒來」,無論是日誌時間戳、備份輪替、定時任務、跨時區協作,皆能精準掌控。

Copyright © Windows教程網 All Rights Reserved