在 PHP 開發中,時間戳與人類可讀的日期格式互轉是極其常見的需求。無論是從資料庫讀取 10 位數的 Unix 時間戳,還是需要將使用者輸入的日期存入資料庫,掌握正確的轉換方法都能讓開發事半功倍。本文將系統整理 PHP 時間處理的核心函式、常見陷阱與最佳實踐。
| 函式 | 用途 | 範例 |
|---|---|---|
time() | 取得目前 Unix 時間戳(整數) | $now = time(); // 1700000000 |
date() | 格式化時間戳為字串 | date('Y-m-d H:i:s', $timestamp) |
mktime() | 由日期時間元件產生時間戳 | mktime(0,0,0,12,4,2008) |
strtotime() | 解析英文日期字串為時間戳 | strtotime('2008-12-04') |
最直觀的方式是使用 date() 的第二個參數傳入時間戳:
$timestamp = 1228348800;
// 完整日期時間
echo date('Y-m-d H:i:s', $timestamp); // 2008-12-04 00:00:00
// 僅日期
echo date('Y-m-d', $timestamp); // 2008-12-04
進階技巧: 若資料庫存的是字串型時間戳,記得先轉型:
$date3 = date('Y-m-d H:i:s', (int)"1228348800");
現代 PHP 建議使用 strtotime(),語意清晰且支援多種格式:
$dateStr = '2008-12-04';
$timestamp = strtotime($dateStr); // 1228348800
// 含時分秒
$timestamp = strtotime('2008-12-04 15:30:45');
舊版寫法(mktime() 拆解字串)已不推薦,易出錯且效能較差。
PHP 5.1+ 預設使用 UTC,若不設定時區,顯示時間會偏移 8 小時(中國標準時間)。三種解決方式:
date.timezone = Asia/Shanghai
date_default_timezone_set('Asia/Shanghai');
ini_set('date.timezone', 'Asia/Shanghai');
常用時區識別碼:
PRC、Asia/Shanghai、Asia/Chongqing、Asia/UrumqiAsia/Hong_Kong、Asia/Macao、Asia/TaipeiAsia/Singapore/**
* 將時間戳格式化為指定格式
*/
function formatTimestamp(int $timestamp, string $format = 'Y-m-d H:i:s'): string
{
return date($format, $timestamp);
}
/**
* 將日期字串解析為時間戳
*/
function parseDate(string $dateStr): ?int
{
$ts = strtotime($dateStr);
return $ts !== false ? $ts : null;
}
// 使用示例
$now = time();
echo "現在: " . formatTimestamp($now) . PHP_EOL;
echo "指定日: " . formatTimestamp(parseDate('2024-01-15') ?? 0) . PHP_EOL;
date() + strtotime() 組合,語意明確、支援格式豐富。date_default_timezone_set(),避免時區 Bug。DateTimeImmutable 物件導向寫法,型別安全更強。