首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UTC中的MySQL日期时间或时间戳值是通过$wpdb检索的吗?

UTC中的MySQL日期时间或时间戳值是通过$wpdb检索的吗?
EN

WordPress Development用户
提问于 2019-05-30 20:04:19
回答 1查看 1.3K关注 0票数 2

我有一个定制的MySQL表,其中有两个列,如下所示:

代码语言:javascript
运行
复制
`timestamp_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`datetime_created`  DATETIME DEFAULT CURRENT_TIMESTAMP,

当使用$wpdb检索这些值时,我想知道结果在哪个时区,以及我是否可以在UTC中获得结果:

代码语言:javascript
运行
复制
$row = $wpdb->get_row("SELECT * FROM `test`", ARRAY_A);
var_export( $row );

背景知识:

我知道WordPress对每个请求都运行这一行,而不管PHP、MySQL或服务器的配置如何,这会影响内置的PHP函数:

代码语言:javascript
运行
复制
date_default_timezone_set( 'UTC' );

我知道管理员可以在管理界面中选择一个时区,该时区存储在数据库中,可以使用get_option( 'timezone_string' )检索。

我知道服务器和MySQL本身可能没有配置为使用UTC。这里有一个查询,证明这里没有使用UTC:

代码语言:javascript
运行
复制
mysql> select now(), utc_timestamp();
+---------------------+---------------------+
| now()               | utc_timestamp()     |
+---------------------+---------------------+
| 2019-05-30 19:26:04 | 2019-05-30 18:26:04 |
+---------------------+---------------------+
EN

回答 1

WordPress Development用户

回答已采纳

发布于 2019-05-30 20:04:19

摘要:

WordPress确实运行date_default_timezone_set( 'UTC' );。它确实有一个时区选项,可由管理员修改并使用get_option( 'timezone_string' )检索。但是,这对通过$wpdb运行的查询没有任何影响。如果您在没有WordPress的情况下运行了You查询,那么<#>You应该从 $wpdb <#>as获得相同的结果。

关于MySQL如何工作的详细信息:

然而,这并不一定意味着返回的值将以UTC为单位。这取决于服务器和MySQL的配置,以及您是使用TIMESTAMP还是DATETIME。只要您从不更改服务器的配置,您就不应该注意到TIMESTAMPDATETIME之间的任何差异(在时区方面)。

代码语言:javascript
运行
复制
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时代(如这样)以来的秒数,这两者都会给出相同的正确结果:

代码语言:javascript
运行
复制
SELECT UNIX_TIMESTAMP(`timestamp_created`) unix_ts, UNIX_TIMESTAMP(`datetime_created`) unix_dt FROM `test`;
+------------+------------+
| unix_ts    | unix_dt    |
+------------+------------+
| 1559244664 | 1559244664 |
+------------+------------+

一旦MySQL或服务器的时区配置发生变化,您就会注意到TIMESTAMPDATETIME之间的区别:

代码语言:javascript
运行
复制
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值,它假设该值位于当前配置的时区,在本例中这是一个错误的假设:

代码语言:javascript
运行
复制
mysql> SELECT UNIX_TIMESTAMP(`timestamp_created`) unix_ts, UNIX_TIMESTAMP(`datetime_created`) unix_dt FROM `test`;
+------------+------------+
| unix_ts    | unix_dt    |
+------------+------------+
| 1559244664 | 1559277064 |
+------------+------------+

Recommendation:

如果您想使用DEFAULT CURRENT_TIMESTAMP,如果您关心时区的正确性,请使用TIMESTAMP类型而不是DATETIME类型。当检索值时,使用UNIX_TIMESTAMP(`timestamp`),您的代码可以很容易地将其转换为人类可读的UTC日期-时间字符串。

票数 2
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/339204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档