核心函式速查
| 需求 | 函式/寫法 | 範例 |
| 取得目前 Unix Timestamp | time() | 1700000000 |
| 日期時間 → Timestamp | strtotime('2023-12-25 10:30:00') | 支援相對時間 strtotime('-1 day') |
| Timestamp → 格式化日期 | date('Y-m-d H:i:s', $timestamp) | 2023-12-25 10:30:00 |
| 當天 00:00:00 Timestamp | strtotime(date('Y-m-d')) 或 mktime(0,0,0,月,日,年) | 適合查詢「今天」資料 |
| 當天 23:59:59 Timestamp | strtotime(date('Y-m-d') . ' +1 day -1 second') | |
資料庫儲存建議
- 欄位型別:
INT(10) UNSIGNED 或 BIGINT(支援 2038 年後)。
- 儲存時:
INSERT ... VALUES (UNIX_TIMESTAMP()) 或 PHP 端 time()。
- 查詢今天資料:
$today_start = strtotime(date('Y-m-d'));
$today_end = strtotime('+1 day', $today_start) - 1;
$sql = "SELECT * FROM `table` WHERE `created_at` BETWEEN $today_start AND $today_end";
常見陷阱與解決
| 問題 | 原因 | 解決 |
| 時區不一致 | PHP、MySQL、系統時區不同 | 統一設定 date_default_timezone_set('Asia/Taipei')、MySQL SET time_zone = '+08:00' |
| 2038 年問題 | 32 位元系統 Timestamp 上限 | 使用 64 位元 PHP、MySQL BIGINT、DateTime 物件 |
| 字串轉換失敗 | 格式不被 strtotime 識別 | 統一用 ISO 8601 (Y-m-d H:i:s),或用 DateTime::createFromFormat |
現代化寫法:DateTime 類別
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
echo $dt->format('Y-m-d H:i:s'); // 格式化輸出
echo $dt->getTimestamp(); // 取得 Timestamp
$dt->modify('+1 day')->setTime(0,0,0); // 運算方便
結語
掌握 time()、strtotime()、date() 三大核心函式,並注意時區一致性,即能輕鬆處理大多數時間戳需求。新專案建議改用 DateTime 物件導向介面,功能更強大且避免 2038 年問題。