我正在开发用户可以选择自己的时区的软件,并且该软件也可以被其他人在其网站上使用,但我想确保数据库中的时区始终设置为{ {1}}。
现在我知道如何为PHP设置默认时区,例如:
UTC
...但我不确定如何确保MySQL使用date_default_timezone_set('Australia/Sydney');
? ...甚至一旦你确定它使用UTC,我猜你必须在将PHP日期/时间传递到UTC
之前将其传递给数据库吗?
我想我想知道许多不同的日期格式,例如UTC
,TIMESTAMP
&甚至是UNIX EPOCH整数时间戳,例如,它可以简单地存储为DATETIME
数据类型。
然后整个从数据库中检索日期/时间并将其转换为相应的时区,最后 DST 如何进入所有这些?
我知道有很多类似的问题,但我想没有人真正回答我的所有问题。
答案 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