[英]PHP & MySQL Timezones whilst supporting user-defined timezones
我正在做一些事情,用戶可以選擇自己的時區,並且該軟件也可以供其他人在其站點上使用,但是我想確保數據庫中的時區始終設置為UTC
。
現在,我知道如何為PHP設置默認時區,例如:
date_default_timezone_set('Australia/Sydney');
...但是我不確定如何確保MySQL使用的是UTC
嗎? ...甚至在您確定它正在使用UTC之后,我想您也必須在將PHP日期/時間轉換為UTC
之后再將其傳遞給數據庫?
我想我想知道許多不同的日期格式,例如TIMESTAMP
, DATETIME
甚至是UNIX EPOCH整數時間戳,例如,它們將簡單地存儲為int
數據類型。
然后是從數據庫檢索整個日期/時間並將其轉換為相應時區的方法,最后, DST如何納入所有這些?
我知道那里有很多類似的問題,但我想沒有一個問題能真正回答我的所有問題。
MySQL的數據類型timestamp
將日期存儲在UTC
。 為了使其正常工作,MySQL使用服務器的時區並進行日期轉換。 它將日期從服務器的當前時區轉換為UTC進行存儲。 這意味着數據庫服務器永遠不應更改其時區以使此功能正常工作。
當您將數據發送到這樣的數據庫時,您也將發送UTC時間。 最簡單的方法是根據MySQL的需求( mdY 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()
結果,但這具有無法使用與日期相關的函數的巨大缺點。
對於當前的mysql會話,您可以嘗試類似
SET time_zone = timezonename;
有關更多詳細信息,您也可以查看此答案https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.