函數定義對比
| 維度 | MySQL UNIX_TIMESTAMP() | PHP time() |
| 無參數調用 | 返回當前 Unix 時間戳 (秒) | 返回當前 Unix 時間戳 (秒) |
| 帶參數調用 | UNIX_TIMESTAMP('2024-01-15 10:30:00') → 秒數 | 不支援 (需 strtotime()) |
| 返回類型 | 無符號整數 (BIGINT) | 整數 (32 位系統 2038 年溢出) |
| 時區處理 | 依賴會話 time_zone 系統變數 | 依賴 date.timezone php.ini 設定 |
| 反向函數 | FROM_UNIXTIME(ts, format) | date(format, ts) |
MySQL 進階用法
-- 1. 字串/日期轉時間戳
SELECT UNIX_TIMESTAMP('2024-01-15 10:30:00'); -- 1705295400
SELECT UNIX_TIMESTAMP('2024-01-15'); -- 1705248000 (00:00:00)
SELECT UNIX_TIMESTAMP(20240115103000); -- 數字格式 YYYYMMDDHHMMSS
-- 2. TIMESTAMP 欄位直接取值 (無隱式轉換,極快)
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
INSERT INTO t VALUES (NOW());
SELECT UNIX_TIMESTAMP(ts) FROM t; -- 直接讀取內部儲存值
-- 3. 格式化輸出
SELECT FROM_UNIXTIME(1705295400); -- '2024-01-15 10:30:00'
SELECT FROM_UNIXTIME(1705295400, '%Y-%m-%d %H:%i'); -- '2024-01-15 10:30'
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y 第%W %M %h:%i:%s %x');
PHP 對應用法
<?php
// 當前時間戳
$ts = time(); // 1705295400
// 格式化
echo date('Y-m-d H:i:s', $ts); // 2024-01-15 10:30:00
echo date('Y-m-d', strtotime('2024-01-15 10:30:00')); // 需 strtotime 解析字串
// DateTime 物件導向 (推薦)
$dt = new DateTime('@' . $ts); // @ 表示 Unix timestamp
echo $dt->format('Y-m-d H:i:s');
$dt->setTimezone(new DateTimeZone('Asia/Taipei'));
同一台伺服器實測對比
-- MySQL
SELECT UNIX_TIMESTAMP(), FROM_UNIXTIME(UNIX_TIMESTAMP());
-- PHP
結果:同一台機器、同步 NTP 時,**兩者返回值完全一致** (秒級)。
關鍵差異與選型建議
| 場景 | 推薦 | 理由 |
| SQL 內部計算/比較 (WHERE 子句、索引範圍) | MySQL UNIX_TIMESTAMP() | 避免跨語言傳遞、利用索引、原生日期運算 |
| 應用層業務邏輯/顯示/序列化 | PHP time() / DateTime | 語言原生、時區處理豐富、單元測試友好 |
| 跨系統同步 (API、消息隊列) | 統一用 Unix Timestamp (秒/毫秒) | 語言無關、緊湊、易傳輸 |
| 高精度需求 (毫秒/微秒) | MySQL UNIX_TIMESTAMP(6) / PHP microtime(true) | MySQL 5.6.4+ 支援微秒,PHP 同樣支援 |
避坑指南
- 時區不一致:MySQL
SET time_zone = '+08:00'; + PHP date_default_timezone_set('Asia/Taipei'); 雙向對齊。
- 32 位 PHP 2038 年問題:強制 64 位環境或用
DateTime 物件。
- MySQL
TIMESTAMP 範圍:1970-2038,超出需用 DATETIME (1000-9999) + UNIX_TIMESTAMP() 手動轉換。
- 隱式轉換效能:
WHERE ts_col = UNIX_TIMESTAMP('2024-01-01') 會導致全表掃描,改用 WHERE ts_col = '2024-01-01' 走索引。