在PHP / MySQL中将date时间存储为UTC
我所读到的有关将时间转换为用户时区的地方都表示,最好的方法是以UTC存储date和时间,然后将用户的时区偏移添加到此时间。
如何以UTC时间存储date? 我使用MySQL DATETIME字段。
当我的PHP代码中添加新的logging到MySQL时,我会使用now()
插入MySQL DATETIME。
我需要使用与now()
不同的东西来存储UTC时间吗?
MySQL: UTC_TIMESTAMP()
以“YYYY-MM-DD HH:MM:SS”或YYYYMMDDHHMMSS.uuuuuu格式返回当前UTCdate和时间,具体取决于函数是在string还是数字上下文中使用
PHP: gmdate()
另外在PHP中使用PHP date_default_timezone_set()
来设置脚本的当前时区。 您可以将其设置为客户端时区,以便所有格式化函数在当地时间返回时间。
事实上,虽然我很难得到这个工作,并总是磕磕绊绊陷入困境。 例如。 从MySQL返回的时间信息不会格式化为“UTC”,所以如果您不小心, 时间戳会将其转换为当地时间。 我很好奇听到有人对这个问题有一个可靠的解决scheme,当date遍历媒体边界(HTTP-> PHP-> MySQL和MySQL-> PHP-> HTTP)时,这个问题也不会中断,同时也考虑XML和RSS /primefaces。
我build议在UTC时区插入date。 这将为您节省很多日后遇到夏令时的麻烦。
INSERT INTO abc_table (registrationtime) VALUES (UTC_TIMESTAMP())
当我查询我的数据时,我使用下面的PHP脚本:
<?php while($row = mysql_fetch_array($registration)) { $dt_obj = new DateTime($row['message_sent_timestamp'] ." UTC"); $dt_obj->setTimezone(new DateTimeZone('Europe/Istanbul')); echo $formatted_date_long=date_format($dt_obj, 'Ymd H:i:s'); } ?>
您可以用一个可用的PHP时区replaceDateTimeZone
值。
NOW()
为您提供运行数据库的系统的时间(包括时区偏移量)。 要得到UTCdate/时间,应该按照MySQL参考手册中的描述使用UTC_TIMESTAMP()
。
https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
在删除的情况下引用上面的所有答案链接:
为了配合@ ypercube的评论CURRENT_TIMESTAMP
存储为UTC,但作为当前时区检索,您可以使用–default_time_zone选项影响您的服务器的时区设置检索。 这使您的检索始终是UTC。
默认情况下,该选项是“系统”,它是系统时区的设置(可能不是UTC!):
mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 1 row in set (0.00 sec) mysql> SELECT CURRENT_TIMESTAMP(); +---------------------+ | CURRENT_TIMESTAMP() | +---------------------+ | 2012-09-25 16:28:45 | +---------------------+ 1 row in set (0.00 sec)
你可以dynamic设置它:
mysql> SET @@session.time_zone='+00:00'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | +00:00 | +--------------------+---------------------+ 1 row in set (0.00 sec)
或者永久在my.cnf中:
[mysqld] **other variables** default_time_zone='+00:00'
重新启动您的服务器,您将看到更改:
mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | +00:00 | +00:00 | +--------------------+---------------------+ 1 row in set (0.00 sec) mysql> SELECT CURRENT_TIMESTAMP(); +---------------------+ | CURRENT_TIMESTAMP() | +---------------------+ | 2012-09-25 20:27:50 | +---------------------+ 1 row in set (0.01 sec)
正如@Haluk所build议的那样,您可以将date存储为UTC datetime
。 当您要插入的date来自PHP代码,并添加一些关于它如何工作的细节时,我正在补充他的答案。
$pdo = new PDO('mysql:host=mydbname.mysql.db;dbname=mydbname', 'myusername', 'mypassword'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $insertStmt = $pdo->prepare("insert into test (last_modified)" ." values(:last_modified)"); $insertStmt->bindParam(':last_modified', $lastModified, PDO::PARAM_STR); $lastModified = gmdate("Ymd H:i:s"); $insertStmt->execute();
实际上PHP中的datetime
时间并没有与之相关的时区。 传递给PDO的内容只是一个string,以MySQL可识别的格式之一,表示UTC时区中的date。 例如,如果date是2015-10-21 19:32:33 UTC+2:00
,上面的代码只是告诉MySQL插入2015-10-21 17:32:33
。 gmtdate("Ymd H:i:s")
以这种格式为您提供当前date。 无论如何,你所要做的就是build立一个代表你想以UTC时间插入的date的string。
然后,当你阅读date时,你必须告诉PHP你刚刚检索的date的时区是UTC。 在Haluk的答案中使用这个代码。
随机:UTC_TIMESTAMP(6)用于6位微秒的时间。
MySQL 5.7+