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

时间:2015-08-28 08:58:42

标签: php mysql sql timezone unix-timestamp

我正在开发用户可以选择自己的时区的软件,并且该软件也可以被其他人在其网站上使用,但我想确保数据库中的时区始终设置为{ {1}}。

现在我知道如何为PHP设置默认时区,例如:

UTC

...但我不确定如何确保MySQL使用date_default_timezone_set('Australia/Sydney'); ? ...甚至一旦你确定它使用UTC,我猜你必须在将PHP日期/时间传递到UTC之前将其传递给数据库吗?

我想我想知道许多不同的日期格式,例如UTCTIMESTAMP&甚至是UNIX EPOCH整数时间戳,例如,它可以简单地存储为DATETIME数据类型。

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

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

2 个答案:

答案 0 :(得分:3)

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

将数据发送到此类数据库时,也会发送UTC时间。最简单的方法是根据MySQL的需要(time())格式化m-d-Y H:i:s的结果。

在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()的结果,但这样做有一个很大的缺点,即无法使用与日期相关的函数。

答案 1 :(得分:1)

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

的内容
SET time_zone = timezonename;

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