簡體   English   中英

PHP和MySQL時區,同時支持用戶定義的時區

[英]PHP & MySQL Timezones whilst supporting user-defined timezones

我正在做一些事情,用戶可以選擇自己的時區,並且該軟件也可以供其他人在其站點上使用,但是我想確保數據庫中的時區始終設置為UTC

現在,我知道如何為PHP設置默認時區,例如:

date_default_timezone_set('Australia/Sydney');

...但是我不確定如何確保MySQL使用的是UTC嗎? ...甚至在您確定它正在使用UTC之后,我想您也必須在將PHP日期/時間轉換為UTC之后再將其傳遞給數據庫?

我想我想知道許多不同的日期格式,例如TIMESTAMPDATETIME甚至是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM