時間戳(Unix Timestamp,秒數)與人類可讀日期時間(YYYY-MM-DD HH:MM:SS)互轉是開發高頻操作。MySQL 與 PHP 均提供原生函數,建議在資料庫層完成轉換以減少網路傳輸與時區歧義,但應用層轉換亦常見,備查速查表如下。
| 方向 | 函數 | 範例 | 結果 |
|---|---|---|---|
| Timestamp → Datetime | FROM_UNIXTIME(ts) | SELECT FROM_UNIXTIME(1156219870); | 2006-10-22 12:31:10 |
| Datetime → Timestamp | UNIX_TIMESTAMP(dt) | SELECT UNIX_TIMESTAMP('2006-11-04 12:23:00'); | 1162614180 |
| 格式化輸出 | DATE_FORMAT(FROM_UNIXTIME(ts), fmt) | DATE_FORMAT(FROM_UNIXTIME(ts), '%Y-%m-%d') | 2006-10-22 |
SELECT * FROM message
WHERE DATE_FORMAT(FROM_UNIXTIME(chattime), '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')
ORDER BY id DESC;
⚠️ 效能提示:對大表,WHERE 使用函數會導致索引失效。優化寫法:
WHERE chattime >= UNIX_TIMESTAMP(DATE(NOW())) AND chattime < UNIX_TIMESTAMP(DATE(NOW()) + INTERVAL 1 DAY)
利用 chattime 整數索引做範圍查詢,極速命中。
| 方向 | 函數 | 範例 | 結果 |
|---|---|---|---|
| Timestamp → 格式化字串 | date(format, ts) | date('Y-m-d H:i:s', 1156219870); | 2006-10-22 12:31:10 |
| 日期字串 → Timestamp | strtotime(datetime_str) | strtotime('2010-03-24 08:15:42'); | 1269392142 |
| DateTime 物件(推薦) | (new DateTime('@'.$ts))->format('Y-m-d H:i:s') | 支援時區、微秒、鏈式操作 | 現代寫法 |
INT UNSIGNED Unix Timestamp(UTC),或 DATETIME(不帶時區,應用層約定 UTC)。避免 存帶時區字串。date_default_timezone_set('UTC'),MySQL SET time_zone = '+00:00',雙端對齊。Intl.DateTimeFormat 或後端 DateTime::setTimezone)。