首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL UNIX_TIMESTAMP() vs PHP time() 函數異同深度解析

     編輯:MySQL 資料庫相關知識

函數定義對比

維度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 同樣支援

避坑指南

  1. 時區不一致:MySQL SET time_zone = '+08:00'; + PHP date_default_timezone_set('Asia/Taipei'); 雙向對齊。
  2. 32 位 PHP 2038 年問題:強制 64 位環境或用 DateTime 物件。
  3. MySQL TIMESTAMP 範圍:1970-2038,超出需用 DATETIME (1000-9999) + UNIX_TIMESTAMP() 手動轉換。
  4. 隱式轉換效能:WHERE ts_col = UNIX_TIMESTAMP('2024-01-01') 會導致全表掃描,改用 WHERE ts_col = '2024-01-01' 走索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved