什麼是 Unix 時間戳?
Unix 時間戳(也稱為 Epoch 時間、POSIX 時間或 Unix 時間)是一種以秒數來追蹤時間的方式。這個計數從 Unix 紀元(1970 年 1 月 1 日 UTC 時間 00:00:00)開始。
例如:
0= 1970 年 1 月 1 日 00:00:00 UTC1700000000= 2023 年 11 月 14 日 22:13:20 UTC2000000000= 2033 年 5 月 18 日 03:33:20 UTC
Unix 時間戳與時區無關,非常適合在不同系統和地區之間儲存和比較日期。
為什麼使用 Unix 時間戳?
Unix 時間戳具有以下優勢:
- 時區無關性 - 儲存一個全球通用的值
- 便於比較 - 簡單的整數比較,方便排序和篩選
- 資料庫效率 - 比格式化日期字串佔用更小的儲存空間
- 跨平台相容 - 幾乎所有程式語言都支援
- 無歧義 - 不會混淆日期格式(月/日 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 億年內都不會溢位。
最佳實踐
- 始終以 UTC 儲存 - 僅在顯示時轉換為本地時間
- 需要精度時使用毫秒 - 當需要亞秒級精度時
- 驗證輸入範圍 - 檢查合理的日期範圍
- 謹慎處理時區轉換 - 使用成熟的函式庫
- 考慮使用 ISO 8601 - API 中使用人類可讀的格式
立即體驗
需要快速轉換時間戳?使用我們的 Unix 時間戳轉換器 - 免費、快速,完全在瀏覽器中執行,不會將資料傳送到伺服器。
功能包括:
- 即時顯示當前時間戳
- 雙向轉換(時間戳 ↔ 日期)
- 多時區支援
- 秒和毫秒精度
- 一鍵複製功能
總結
Unix 時間戳是軟體開發中的基礎概念。了解它們的工作原理以及如何在不同語言之間轉換,將幫助您建構能夠正確處理跨時區和系統時間的更健壯的應用程式。
無論您是在除錯 API 回應、分析日誌還是建構時間敏感的功能,紮實掌握 Unix 時間戳對任何開發者來說都是必備技能。