PHP和MySQL时区,同时支持用户定义的时区


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数据类型。

然后是从DB中检索日期/时间并将其转换为相应的时区,最后DST如何进入所有这一切?

我知道有很多类似的问题,但我想没有一个能真正回答我所有的问题。

MySQL的数据类型timestampUTC中存储日期。为了使其正常工作,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()的结果,但这有一个巨大的缺点,即不能使用与日期相关的函数。

对于mysql的当前会话,您可以尝试这样做

SET time_zone = timezonename;

要了解更多信息,您也可以查看这个答案https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp