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
,然后再将其传递给数据库?
我想我想知道许多不同的日期格式,例如 TIMESTAMP
、DATETIME
甚至 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时,最好使用DateTime
class。它允许您使用时区信息偏移日期,这意味着您不必使用 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()
的结果,但这有一个巨大的缺点,即无法使用与日期相关的函数.
我正在做一些事情,用户可以 select 他们自己的时区,其他人也可以在他们的网站上使用该软件,但我想确保时区在数据库始终设置为 UTC
.
现在我知道你如何设置PHP的默认时区了,比如:
date_default_timezone_set('Australia/Sydney');
...但我不确定如何确保 MySQL 正在使用 UTC
? ...甚至一旦您确定它使用的是 UTC,我想您必须先将 PHP dates/times 转换为 UTC
,然后再将其传递给数据库?
我想我想知道许多不同的日期格式,例如 TIMESTAMP
、DATETIME
甚至 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时,最好使用DateTime
class。它允许您使用时区信息偏移日期,这意味着您不必使用 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()
的结果,但这有一个巨大的缺点,即无法使用与日期相关的函数.