我正在做一些事情,用户可以选择他们自己的时区,软件也可以被其他人在他们的网站上使用,但我想确保数据库中的时区总是设置为 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 的要求 (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()
的结果,但这有一个很大的缺点,那就是不能使用 date-相关功能。
关于PHP 和 MySQL 时区,同时支持用户定义的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267157/