2015-08-28 57 views
0

我正在开发一些用户可以选择自己的时区并且软件可以被他人网站上的其他人使用的东西,但是我想确保数据库中的时区始终设置为UTCPHP和MySQL时区,同时支持用户定义的时区

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

date_default_timezone_set('Australia/Sydney'); 

...但我不知道如何确保MySQL正在使用UTC? ...甚至一旦你确定它正在使用UTC我想你必须在将它的日期/时间转换为UTC之后再将它传递到数据库?

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

再有就是整个从数据库中检索日期/时间并将其转换为相应的时区,最后如何DST进入了这一切?

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

+0

时间戳与时区无关,所以如果您在数据库中使用它,您将能够在PHP中使用它。对于DST,它根据所选时区由PHP进行管理。要知道是否有时间在DST中,您可以使用“日期”功能和“I” – mmm

回答

3

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()结果,但是这并没有能够使用日期有关的一个巨大的劣势功能。