MySQL 拒绝 return 24 小时制 - 所有时间都在修改后的 12 小时制

MySQL refuses to return 24hr time - all times in modified 12hr

我们的生产 MySQL 服务器拒绝以 24 小时格式 return 次,而是选择 12 小时格式。我搜索了 SO 和 Google,但所有问题都与格式相关,我的格式没有问题。

一个基本的例子;

mysql> SELECT FROM_UNIXTIME(1442987399);
+---------------------------+
| FROM_UNIXTIME(1442987399) |
+---------------------------+
| 2015-09-23 05:49:59       |
+---------------------------+
1 row in set (0.00 sec)

正在检查 http://www.epochconverter.com/

Your time zone: 9/23/2015, 3:49:59 PM GMT+10:00

这不是时间问题,实际上是 15:49 下午。

问题是,即使我尝试强制使用 24 小时格式,它仍然不会这样做......

mysql> SELECT HOUR(DATE_FORMAT(FROM_UNIXTIME(1442987399), "%T"));
+----------------------------------------------------+
| HOUR(DATE_FORMAT(FROM_UNIXTIME(1442987399), "%T")) |
+----------------------------------------------------+
|                                                  5 |
+----------------------------------------------------+
1 row in set (0.00 sec)

有趣的是,在 12 小时内它是 3,而不是 5。在 24 小时内它是 15。所以,这两种格式都不正确。

奇怪的是,我们在 +10 时区,会不会因为某种原因减去 10 小时?

时间戳是什么时间并不重要...我已经在数据库中的许多时间戳和行中测试了这一点。

所有这些查询在我的本地和开发服务器上都按预期工作。我对 MySQL 日期函数并不陌生。不过我是这个问题的新手。

在我的本地;

mysql> SELECT HOUR(DATE_FORMAT(FROM_UNIXTIME(1442987399), "%T"));
+----------------------------------------------------+
| HOUR(DATE_FORMAT(FROM_UNIXTIME(1442987399), "%T")) |
+----------------------------------------------------+
|                                                 15 |
+----------------------------------------------------+
1 row in set (0.00 sec)

很清楚,我也可以删除 DATE_FORMAT,它只是为了公平比较。

mysql> SELECT HOUR(FROM_UNIXTIME(1442987399));
+---------------------------------+
| HOUR(FROM_UNIXTIME(1442987399)) |
+---------------------------------+
|                              15 |
+---------------------------------+
1 row in set (0.00 sec)

编辑

感谢@irina-avram,这是一个 time_zone 问题。

mysql> SHOW VARIABLES LIKE '%time_zone%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | UTC   |
| time_zone        | UTC   |
+------------------+-------+
2 rows in set (0.00 sec)

据此,该值在当前时区中给出,您的提供者之一:

FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format):

Returns a representation of the unix_timestamp argument 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. The value is expressed in the current time zone. unix_timestamp is an internal timestamp value such as is produced by the UNIX_TIMESTAMP() function.

( https://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_from-unixtime )

但你可以试试这个:

SET time_zone='+10:00';
SELECT FROM_UNIXTIME(1442987399);