PHP & MySQL 时区同时支持用户自定义时区

PHP & MySQL Timezones whilst supporting user-defined timezones

我正在做一些事情,用户可以 select 他们自己的时区,其他人也可以在他们的网站上使用该软件,但我想确保时区在数据库始终设置为 UTC.

现在我知道你如何设置PHP的默认时区了,比如:

date_default_timezone_set('Australia/Sydney');

...但我不确定如何确保 MySQL 正在使用 UTC? ...甚至一旦您确定它使用的是 UTC,我想您必须先将 PHP dates/times 转换为 UTC,然后再将其传递给数据库?

我想我想知道许多不同的日期格式,例如 TIMESTAMPDATETIME 甚至 UNIX EPOCH 整数时间戳,它们将简单地存储为 int 数据类型。

然后是从数据库中检索 dates/times 并将其转换为相应时区的整个过程,最后 DST 是如何进入所有这些的?

我知道那里有很多类似的问题,但我想 none 确实回答了我所有的问题。

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

SET time_zone = timezonename;

有关更多详细信息,您还可以查看此答案https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp

MySQL 的数据类型 timestamp 将日期存储在 UTC 中。为了使其正常工作,MySQL 使用服务器的时区并进行日期转换。它将日期从服务器的当前时区转换为 UTC 进行存储。这意味着数据库服务器永远不应更改其时区以使此功能正常工作。

当您将数据发送到此类数据库时,您也发送了 UTC 时间。最简单的方法是根据 MySQL 的要求 (m-d-Y H:i:s).

格式化 time() 的结果

在PHP中,将插入日期格式化为MySQL时,最好使用DateTimeclass。它允许您使用时区信息偏移日期,这意味着您不必使用 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() 的结果,但这有一个巨大的缺点,即无法使用与日期相关的函数.