我有一个定制的MySQL表,其中有两个列,如下所示:
`timestamp_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`datetime_created` DATETIME DEFAULT CURRENT_TIMESTAMP,
当使用$wpdb
检索这些值时,我想知道结果在哪个时区,以及我是否可以在UTC中获得结果:
$row = $wpdb->get_row("SELECT * FROM `test`", ARRAY_A);
var_export( $row );
我知道WordPress对每个请求都运行这一行,而不管PHP、MySQL或服务器的配置如何,这会影响内置的PHP函数:
date_default_timezone_set( 'UTC' );
我知道管理员可以在管理界面中选择一个时区,该时区存储在数据库中,可以使用get_option( 'timezone_string' )
检索。
我知道服务器和MySQL本身可能没有配置为使用UTC。这里有一个查询,证明这里没有使用UTC:
mysql> select now(), utc_timestamp();
+---------------------+---------------------+
| now() | utc_timestamp() |
+---------------------+---------------------+
| 2019-05-30 19:26:04 | 2019-05-30 18:26:04 |
+---------------------+---------------------+
发布于 2019-05-30 20:04:19
WordPress确实运行date_default_timezone_set( 'UTC' );
。它确实有一个时区选项,可由管理员修改并使用get_option( 'timezone_string' )
检索。但是,这对通过$wpdb
运行的查询没有任何影响。如果您在没有WordPress的情况下运行了You查询,那么<#>You应该从 $wpdb
<#>as获得相同的结果。
然而,这并不一定意味着返回的值将以UTC为单位。这取决于服务器和MySQL的配置,以及您是使用TIMESTAMP
还是DATETIME
。只要您从不更改服务器的配置,您就不应该注意到TIMESTAMP
和DATETIME
之间的任何差异(在时区方面)。
mysql> SELECT `timestamp_created`, `datetime_created` FROM `test`;
+---------------------+---------------------+
| timestamp_created | datetime_created |
+---------------------+---------------------+
| 2019-05-30 20:31:04 | 2019-05-30 20:31:04 |
+---------------------+---------------------+
只要您从不更改服务器的配置,您就可以获得自UTC中的UNIX时代(如这样)以来的秒数,这两者都会给出相同的正确结果:
SELECT UNIX_TIMESTAMP(`timestamp_created`) unix_ts, UNIX_TIMESTAMP(`datetime_created`) unix_dt FROM `test`;
+------------+------------+
| unix_ts | unix_dt |
+------------+------------+
| 1559244664 | 1559244664 |
+------------+------------+
一旦MySQL或服务器的时区配置发生变化,您就会注意到TIMESTAMP
和DATETIME
之间的区别:
mysql> SET time_zone = '-8:00';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT `timestamp_created`, `datetime_created` FROM `test`;
+---------------------+---------------------+
| timestamp_created | datetime_created |
+---------------------+---------------------+
| 2019-05-30 11:31:04 | 2019-05-30 20:31:04 |
+---------------------+---------------------+
您可以看到,尽管我们在同一个表上运行它,其值与前面的查询相同,但在第一列中得到了不同的结果,但意外的是,第二列中的结果与前面的结果相同。这是因为TIMESTAMP
(第一列)识别配置时区中的更改,并正在转换为显示的新时区。在幕后,TIMESTAMP
存储为自UTC的Unix以来的秒数。然而,DATETIME
只是天真地存储日期时间,而没有引用任何时区信息,所以它给了我们相同的结果,即使我们在MySQL中更改了时区。
UNIX_TIMESTAMP
知道如何正确使用TIMESTAMP
值。对于DATETIME
值,它假设该值位于当前配置的时区,在本例中这是一个错误的假设:
mysql> SELECT UNIX_TIMESTAMP(`timestamp_created`) unix_ts, UNIX_TIMESTAMP(`datetime_created`) unix_dt FROM `test`;
+------------+------------+
| unix_ts | unix_dt |
+------------+------------+
| 1559244664 | 1559277064 |
+------------+------------+
如果您想使用DEFAULT CURRENT_TIMESTAMP
,如果您关心时区的正确性,请使用TIMESTAMP
类型而不是DATETIME
类型。当检索值时,使用UNIX_TIMESTAMP(`timestamp`)
,您的代码可以很容易地将其转换为人类可读的UTC日期-时间字符串。
https://wordpress.stackexchange.com/questions/339204
复制相似问题