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 時間戳與日期時間互轉指令大全

編輯:Linux 教學

前言

Linux 系統管理、日誌分析、腳本開發中,Unix 時間戳(自 1970-01-01 00:00:00 UTC 秒數)與人類可讀日期互轉是高頻需求。本文匯總 date、perl、php、python、bash 內建等多種工具的轉換語法,並區分 GNU date(Linux)與 BSD date(macOS/FreeBSD)差異。

一、GNU date(Linux 標準)核心語法

需求指令範例輸出
當前時間戳date +%s1709647200
指定日期轉時間戳date -d "2024-03-05 14:30:00" +%s1709647200
支援自然語言date -d "yesterday" +%s
date -d "last friday" +%s
date -d "2 weeks ago" +%s
相對時間戳
時間戳轉日期(預設格式)date -d @1709647200Tue Mar 5 14:30:00 CST 2024
時間戳轉自訂格式date -d @1709647200 +"%Y-%m-%d %H:%M:%S"2024-03-05 14:30:00
時間戳轉 UTCdate -u -d @1709647200 +"%Y-%m-%d %H:%M:%S"2024-03-05 06:30:00
格式化當前時間date +"%F %T"2024-03-05 14:30:00
常用格式字元%F=%Y-%m-%d %T=%H:%M:%S %s=時間戳 %N=奈秒 %z=時區偏移—

批次轉換範例


# 檔案每行一個時間戳,轉換為日期
cat timestamps.txt | while read ts; do date -d @$ts +"%F %T"; done

# 管線處理日誌時間欄位
awk '{print $1}' access.log | while read ts; do date -d @$ts +"[%F %T]"; done

二、BSD date(macOS / FreeBSD)差異語法

需求GNU date (Linux)BSD date (macOS/FreeBSD)
日期轉時間戳date -d "2024-03-05 14:30:00" +%sdate -j -f "%Y-%m-%d %H:%M:%S" "2024-03-05 14:30:00" +%s
時間戳轉日期date -d @1709647200date -r 1709647200
時間戳轉自訂格式date -d @1709647200 +"%F %T"date -r 1709647200 +"%F %T"
自然語言相對時間date -d "yesterday"date -v-1d(需 -v 參數)

macOS 建議安裝 GNU date:brew install coreutils → 使用 gdate 指令,語法與 Linux 完全一致。

三、程式語言一鍵轉換

Python 3


# 時間戳 → 日期
python3 -c "import datetime; print(datetime.datetime.fromtimestamp(1709647200).strftime('%Y-%m-%d %H:%M:%S'))"
# 日期 → 時間戳
python3 -c "import datetime; print(int(datetime.datetime(2024,3,5,14,30).timestamp()))"
# UTC 版本
python3 -c "import datetime; print(datetime.datetime.utcfromtimestamp(1709647200).strftime('%Y-%m-%d %H:%M:%S'))"

Perl


# 時間戳 → 日期
perl -e "use POSIX; print strftime('%Y-%m-%d %H:%M:%S', localtime(1709647200)), \"\n\";"
# 日期 → 時間戳
perl -e "use Time::Local; print timelocal(0,30,14,5,2,124), \"\n\";"  # 月份 0-11

PHP


# 時間戳 → 日期
php -r "echo date('Y-m-d H:i:s', 1709647200) . PHP_EOL;"
# 日期 → 時間戳
php -r "echo strtotime('2024-03-05 14:30:00') . PHP_EOL;"
# mktime 手動構造
php -r "echo mktime(14,30,0,3,5,2024) . PHP_EOL;"

Bash 內建(無外部依賴,需 bash 4.2+)


# 時間戳 → 日期(printf 格式化)
printf '%(%Y-%m-%d %H:%M:%S)T\n' 1709647200

# 當前時間戳
printf '%(%s)T\n' -1

四、時區處理關鍵點

  • date 預設使用系統時區(/etc/localtime 或 $TZ)。
  • 強制 UTC:date -u ... 或 TZ=UTC date ...。
  • 指定時區:TZ=Asia/Taipei date -d @1709647200。
  • 時間戳本身不含時區資訊(永遠是 UTC 秒數),轉換時才套用時區。

五、高精度:奈秒級時間戳


# GNU date 奈秒
date +%s%N          # 秒+奈秒(19 位數)
date +%s.%N         # 秒.奈秒(浮點數字串)

# Python 3.7+ time.time_ns()
python3 -c "import time; print(time.time_ns())"

# Bash 5.0+ $EPOCHREALTIME
echo $EPOCHREALTIME

六、實戰腳本片段


#!/bin/bash
# 將日誌中 Unix 時間戳欄位轉為可讀格式
# 輸入:2024-03-05 14:30:00 [1709647200] message
# 輸出:2024-03-05 14:30:00 [2024-03-05 14:30:00] message

while IFS= read -r line; do
    if [[ $line =~ \[([0-9]{10})\] ]]; then
        ts=${BASH_REMATCH[1]}
        readable=$(date -d @$ts +"%F %T")
        line=${line/\[$ts\]/[$readable]}
    fi
    echo "$line"
done < app.log > app_readable.log

七、總結

  • Linux 環境首選 GNU date:date -d @TS +FMT、date -d "STR" +%s 覆蓋 99% 場景。
  • macOS/FreeBSD 必須使用 -j -f / -r 語法,或安裝 gdate 統一體驗。
  • 腳本中批次轉換論用 while read + date 或 python3 -c 避免反覆啟動進程。
  • 永遠記住:時間戳 = UTC 秒數,顯示時才套用時區。
Copyright © Windows教程網 All Rights Reserved