的主要問題是MySQL對時區的支持是可笑。大多數其他數據庫允許您將時區定義爲日期時間列的一部分,但不是MySQL。相反,它們會強制您執行連接範圍或服務器範圍的時區設置。
最好的辦法是確保MySQL將所有日期時間存儲爲GMT/UTC。您可以通過在連接上運行SET time_zone = 'UTC'
來強制執行此操作。在設置字符集的同時執行此操作。你是設置連接字符集,對?
PHP端,然後您可以使用DateTime和DateTimeZone的組合來獲取MySQL的日期時間並將它們顯示在用戶的時區中。例如,假設我們從MySQL DATETIME
列中獲取日期2012-11-13 14:15:16
。從PHP交互提示:
php > $from_mysql = '2012-11-13 14:15:16';
php > $utc = new DateTimeZone('UTC');
php > $ts = new DateTime($from_mysql, $utc);
php > $pdt = new DateTimeZone('America/Los_Angeles');
php > $ts_pdt = clone $ts;
php > $ts_pdt->setTimezone($pdt);
php > echo $ts_pdt->format('r'), "\n";
Tue, 13 Nov 2012 06:15:16 -0800
作爲證明,你只需要通過明確告訴它創建日期時間你是UTC,如果UTC是不是你已經使用date_default_timezone_set
設置時區。切換DateTime的時區與給它一個新的一樣簡單。我在這裏使用clone
來複制副本。 DateTimes是可變的,並且有時很容易發現自己意外地破壞它。
反向日期數學的工作方式相同,只是將其選擇轉換爲UTC並在本機數字上運行數學運算。
TL;博士:
- 商店和執行UTC上日期時間計算(GMT)僅
- 顯示用戶的時區僅
什麼版本的所有日期時間的PHP使用? – Lars
5.4我已經通過date_default_timezone_set爲西海岸設置了時區,它似乎在做詭計,然而有些事情在邏輯上搞砸了 –