返回 網站動態
DevTool Team

Unix 時間戳完全指南:轉換、使用和理解 Epoch 時間

全面了解 Unix 時間戳 - 它是什麼、如何轉換,以及 JavaScript、Python 和 PHP 中的實用程式碼範例。

什麼是 Unix 時間戳?

Unix 時間戳(也稱為 Epoch 時間POSIX 時間Unix 時間)是一種以秒數來追蹤時間的方式。這個計數從 Unix 紀元(1970 年 1 月 1 日 UTC 時間 00:00:00)開始。

例如:

  • 0 = 1970 年 1 月 1 日 00:00:00 UTC
  • 1700000000 = 2023 年 11 月 14 日 22:13:20 UTC
  • 2000000000 = 2033 年 5 月 18 日 03:33:20 UTC

Unix 時間戳與時區無關,非常適合在不同系統和地區之間儲存和比較日期。

為什麼使用 Unix 時間戳?

Unix 時間戳具有以下優勢:

  1. 時區無關性 - 儲存一個全球通用的值
  2. 便於比較 - 簡單的整數比較,方便排序和篩選
  3. 資料庫效率 - 比格式化日期字串佔用更小的儲存空間
  4. 跨平台相容 - 幾乎所有程式語言都支援
  5. 無歧義 - 不會混淆日期格式(月/日 vs 日/月)

常見使用場景

  • API 回應 - 大多數 REST API 以 Unix 格式回傳時間戳
  • 資料庫儲存 - 高效儲存時間資料
  • 日誌分析 - 便於排序和篩選日誌條目
  • 快取管理 - 計算快取過期時間
  • 工作階段管理 - 追蹤使用者工作階段時長

秒級 vs 毫秒級

有兩種常見格式:

格式 位數 範例 使用場景
10 1700000000 Unix 系統、PHP、Python
毫秒 13 1700000000000 JavaScript、Java、現代 API

快速提示: 如果時間戳有 13 位數字,說明是毫秒格式。除以 1000 即可轉換為秒。

不同語言中的時間戳轉換

JavaScript

// 當前時間戳(毫秒)
const now = Date.now();
console.log(now); // 1700000000000

// 當前時間戳(秒)
const nowSeconds = Math.floor(Date.now() / 1000);
console.log(nowSeconds); // 1700000000

// 時間戳轉日期
const date = new Date(1700000000 * 1000);
console.log(date.toISOString()); // "2023-11-14T22:13:20.000Z"

// 日期轉時間戳
const timestamp = Math.floor(new Date('2023-11-14').getTime() / 1000);
console.log(timestamp); // 1699920000

Python

在我們的 Python 執行器 中試試下面的程式碼 - 完全在瀏覽器中執行!

import time
from datetime import datetime, timezone

# 當前時間戳
now = int(time.time())
print(now)  # 1700000000

# 時間戳轉日期時間
dt = datetime.fromtimestamp(1700000000)
print(dt)  # 2023-11-14 22:13:20

# 日期時間轉時間戳
timestamp = int(datetime(2023, 11, 14).timestamp())
print(timestamp)  # 1699920000

# UTC 轉換(推薦方式)
dt_utc = datetime.fromtimestamp(1700000000, tz=timezone.utc)
print(dt_utc)  # 2023-11-14 22:13:20+00:00

PHP

在我們的 PHP 執行器 中試試下面的程式碼 - 完全在瀏覽器中執行!

<?php
// 當前時間戳
$now = time();
echo $now; // 1700000000

// 時間戳轉日期
$date = date('Y-m-d H:i:s', 1700000000);
echo $date; // "2023-11-14 22:13:20"
echo "\n";

// 日期轉時間戳
$timestamp = strtotime('2023-11-14');
echo $timestamp; // 1699920000
echo "\n";

// 帶時區轉換
$dt = new DateTime('@1700000000');
$dt->setTimezone(new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s T'); // "2023-11-15 06:13:20 CST"
echo "\n";
?>

重要時間戳參考

時間戳 日期 意義
0 1970-01-01 00:00:00 Unix 紀元
1000000000 2001-09-09 01:46:40 十億秒
1234567890 2009-02-13 23:31:30 連續數字
2147483647 2038-01-19 03:14:07 32 位元有號上限
4294967295 2106-02-07 06:28:15 32 位元無號上限

2038 年問題

2038 年問題(也稱為 Y2K38 或 Unix 千年蟲)發生的原因是許多系統將 Unix 時間戳儲存為有號 32 位元整數。最大值為 2147483647,對應:

2038 年 1 月 19 日 03:14:07 UTC

在此時刻之後,使用 32 位元時間戳的系統將溢位並回繞到負數,可能將日期解釋為 1901 年。

解決方案

  • 使用 64 位元整數(現代系統)
  • 使用無號 32 位元整數(可延長到 2106 年)
  • 遷移到 64 位元相容的資料庫和系統

大多數現代系統和程式語言現在預設使用 64 位元時間戳,在未來 2920 億年內都不會溢位。

最佳實踐

  1. 始終以 UTC 儲存 - 僅在顯示時轉換為本地時間
  2. 需要精度時使用毫秒 - 當需要亞秒級精度時
  3. 驗證輸入範圍 - 檢查合理的日期範圍
  4. 謹慎處理時區轉換 - 使用成熟的函式庫
  5. 考慮使用 ISO 8601 - API 中使用人類可讀的格式

立即體驗

需要快速轉換時間戳?使用我們的 Unix 時間戳轉換器 - 免費、快速,完全在瀏覽器中執行,不會將資料傳送到伺服器。

功能包括:

  • 即時顯示當前時間戳
  • 雙向轉換(時間戳 ↔ 日期)
  • 多時區支援
  • 秒和毫秒精度
  • 一鍵複製功能

總結

Unix 時間戳是軟體開發中的基礎概念。了解它們的工作原理以及如何在不同語言之間轉換,將幫助您建構能夠正確處理跨時區和系統時間的更健壯的應用程式。

無論您是在除錯 API 回應、分析日誌還是建構時間敏感的功能,紮實掌握 Unix 時間戳對任何開發者來說都是必備技能。


對時間戳有疑問?查看轉換器頁面的常見問題,或在我們的工具集中探索更多開發者工具。