2015-08-28 73 views
0

我正在開發一些用戶可以選擇自己的時區並且軟件可以被他人網站上的其他人使用的東西,但是我想確保數據庫中的時區始終設置爲UTCPHP和MySQL時區,同時支持用戶定義的時區

現在我知道你是如何設置PHP的默認時區,如:

date_default_timezone_set('Australia/Sydney'); 

...但我不知道如何確保MySQL正在使用UTC? ...甚至一旦你確定它正在使用UTC我想你必須在將它的日期/時間轉換爲UTC之後再將它傳遞到數據庫?

我想我想知道許多不同的日期格式,如TIMESTAMPDATETIME這將簡單地存儲爲int數據類型,例如&甚至UNIX EPOCH整數時間戳。

再有就是整個從數據庫中檢索日期/時間並將其轉換爲相應的時區,最後如何DST進入了這一切?

我知道那裏有很多類似的問題,但我想沒有人真正回答我的所有問題。

+0

時間戳與時區無關,所以如果您在數據庫中使用它,您將能夠在PHP中使用它。對於DST,它根據所選時區由PHP進行管理。要知道是否有時間在DST中,您可以使用「日期」功能和「I」 – mmm

回答

3

MySQL的數據類型timestamp商店的具體日期,UTC。爲了正常工作,MySQL使用服務器的時區並進行日期轉換。它將服務器當前時區的日期轉換爲UTC以進行存儲。這意味着數據庫服務器不應該更改其時區以使此功能正常工作。

當你發送數據到這樣的數據庫時,你也發送UTC時間。最簡單的方法是根據MySQL要求的格式(m-d-Y H:i:s)格式化time()的結果。

在PHP中,當您格式化插入MySQL的日期時,最好使用DateTime類。它可以讓你用時區信息抵消日期,這意味着你不必使用date_default_timezone_set函數 - 這可能會導致錯誤。

在行動DateTime一個例子:

$date = '1.12.2015 13:37:37'; // Format is day.month.year hour:minute:second 

// We create DateTime from custom date format, for the person who resides in Australia/Sydney time zone 
$dt = DateTime::createFromFormat('d.m.Y H:i:s', $date, new DateTimeZone('Australia/Sydney'); 

// Now we change the date's time zone into UTC, and we can insert it into MySQL 
$dt->setTimeZone(new DateTimeZone('UTC')); 

// This is the formatted date-string that can be safely inserted into MySQL 
$date_string_for_mysql = $dt->format('m-d-Y H:i:s'); 

或者,也可以在MySQL中使用int類型時間戳存儲和插入的time()結果,但是這並沒有能夠使用日期有關的一個巨大的劣勢功能。