Storing datetime as UTC in PHP/MySQL
我读到的关于将时间转换为用户时区的地方说,最好的方法是以UTC格式存储日期和时间,然后将用户的时区偏移量添加到此时间。
如何以UTC时间存储日期? 我使用MySQL DATETIME字段。
在我的PHP代码中向MySQL添加新记录时,我会使用
我是否需要使用与
MySQL:
Returns the current UTC date and time
as a value in 'YYYY-MM-DD HH:MM:SS' or
YYYYMMDDHHMMSS.uuuuuu format,
depending on whether the function is
used in a string or numeric context
PHP:
此外,PHP
事实上,虽然我很难让这个工作,并总是绊倒一些陷阱。例如。从MySQL返回的时间信息未格式化为"UTC",因此如果您不小心,strtotime会将其转换为本地时间。我很想知道是否有人有一个可靠的解决方案可以解决这个问题,当日期遍历媒体边界时(HTTP-> PHP-> MySQL和MySQL-> PHP-> HTTP),也会考虑XML和RSS /原子。
我建议在UTC时区插入日期。这将为您节省很多令人头疼的问题。
1 | INSERT INTO abc_table (registrationtime) VALUES (UTC_TIMESTAMP()) |
当我查询我的数据时,我使用以下PHP脚本:
1 2 3 4 5 6 7 8 9 | <?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, 'Y-m-d H:i:s'); } ?> |
您可以使用其中一个可用的PHP时区替换
https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
如果删除,请从上面的链接中引用所有答案:
要与@ ypercube的注释
默认情况下,选项为"SYSTEM",这是您的系统时区设置方式(可能是也可能不是UTC!):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) |
您可以动态设置:
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 | [mysqld] **other variables** default_time_zone='+00:00' |
重新启动服务器,您将看到更改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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建议的那样,您可以将日期存储为UTC
当你想要插入的日期来自PHP代码并添加一些有关它如何工作的细节时,我正在补充他的答案:
1 2 3 4 5 6 7 8 | $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("Y-m-d H:i:s"); $insertStmt->execute(); |
实际上PHP中的
然后,当您阅读日期时,您必须告诉PHP您刚刚检索的日期的时区是UTC。使用Haluk的答案中的代码。
随机:
MySQL 5.7+