首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 字串時間轉 Unix 時間戳完整教學:手動解析 vs 內建函式對比

     編輯:PHP 相關知識

需求場景

將格式為 "YYYY-MM-DD HH:MM:SS" 的字串時間轉換為 Unix 時間戳(整數秒數),以便儲存、比較、運算。

方法一:手動拆解 + mktime()(教學用)

<?php
$strtime = "2000-02-12 16:20:35";

// 步驟 1: 以 '-' 分割日期部分
$array = explode("-", $strtime);
$year  = $array[0];          // 2000
$month = $array[1];          // 02
$rest  = $array[2];          // "12 16:20:35"

// 步驟 2: 以 ':' 分割時間部分
$array = explode(":", $rest);
$minute = $array[1];         // 20
$second = $array[2];         // 35

// 步驟 3: 以空格分割 "12 16"
$array = explode(" ", $array[0]);
$day  = $array[0];           // 12
$hour = $array[1];           // 16

// 步驟 4: 產生時間戳
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);

echo "字串時間:$strtime
"; echo "年:$year
"; echo "月:$month
"; echo "日:$day
"; echo "時:$hour
"; echo "分:$minute
"; echo "秒:$second
"; echo "轉換為 timestamp:$timestamp
"; echo "從 timestamp 轉回來:" . date("Y-m-d H:i:s", $timestamp) . "
"; ?>

缺點

  • 程式碼冗長、易出錯(分割順序、索引易搞混)。
  • 無法處理其他格式(如 YYYY/MM/DD、DD.MM.YYYY、含時區)。
  • 不驗證日期合法性(如 2023-02-30 會被 mktime 自動修正為 3 月 2 日)。

方法二:strtotime() 一行搞定(推薦)

<?php
$strtime = "2000-02-12 16:20:35";
$timestamp = strtotime($strtime);

echo "Timestamp: $timestamp
"; echo "Back: " . date("Y-m-d H:i:s", $timestamp) . "
"; // 支援多種格式 $formats = [ "2024-12-20 14:30:00", "2024/12/20 14:30:00", "20 Dec 2024 14:30:00", "next Monday", "+1 week 2 days", "yesterday 10:00", ]; foreach ($formats as $f) { echo "$f => " . date('Y-m-d H:i:s', strtotime($f)) . "
"; } ?>

注意事項

  • 時區影響:strtotime() 使用 date.timezone 設定(php.ini 或 date_default_timezone_set())。
  • 32 位元系統 2038 年問題:時間戳超過 2^31-1 會溢位,建議用 64 位元 PHP 或 DateTime。
  • 歧義格式:02/03/2024 美式=2月3日、歐式=3月2日,盡量用 ISO 8601 YYYY-MM-DD。

方法三:DateTime 物件導向(現代最佳實踐)

<?php
$strtime = "2000-02-12 16:20:35";

// 建立 DateTime 物件(可指定時區)
$dt = new DateTime($strtime, new DateTimeZone('Asia/Taipei'));

// 取得 Unix 時間戳
$timestamp = $dt->getTimestamp(); // 或 $dt->format('U')

echo "Timestamp: $timestamp
"; echo "Formatted: " . $dt->format('Y-m-d H:i:s') . "
"; // 進階:從特定格式建立 $dt2 = DateTime::createFromFormat('Y-m-d H:i:s', $strtime, new DateTimeZone('UTC')); if ($dt2) { echo "Parsed OK: " . $dt2->format('c') . "
"; } // 日期運算直觀易讀 $dt->modify('+1 week')->modify('+3 days')->setTime(9, 0, 0); echo "一週三天後早上9點: " . $dt->format('Y-m-d H:i:s') . "
";

格式對照表

格式字元 說明 範例
Y4 位數年份2024
m2 位數月份 (01-12)12
d2 位數日期 (01-31)20
H24 小時制 (00-23)14
i分鐘 (00-59)30
s秒數 (00-59)00
u微秒 (PHP 5.2.2+)123456
UUnix 時間戳1703074200
cISO 8601 完整格式2024-12-20T14:30:00+08:00

常見陷阱與解法

  1. 字串含時區資訊:2024-12-20T14:30:00+08:00 → 直接用 new DateTime() 或 strtotime() 自動處理。
  2. 非標準格式:2024年12月20日 14時30分 → 用 DateTime::createFromFormat('Y年m月d日 H時i分', $str)。
  3. 資料庫 DATETIME 欄位:讀出即為字串,直接 strtotime($row['created_at']) 或 new DateTime($row['created_at'])。
  4. 批次轉換效能:strtotime() 比 DateTime 快約 2-3 倍,百萬筆以上可考慮。

總結建議

  • 簡單專案/舊代碼維護:strtotime() 最簡潔。
  • 現代專案/複雜日期運算/時區處理:DateTime 物件導向,語意清晰、可測試、支援不可變模式(DateTimeImmutable)。
  • 教學/理解底層:手動 explode() + mktime() 有助理解時間戳構成,但生產環境請勿使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved