如何设置MySQL的时区?

omg*_*omg 301 mysql timezone

在一台服务器上,当我运行时:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在另一台服务器上

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

Tim*_*nen 479

我认为这可能有用:

有三个地方可以在MySQL中设置时区:

在[mysqld]部分的文件"my.cnf"中

default-time-zone='+00:00'
Run Code Online (Sandbox Code Playgroud)

@@ global.time_zone变量

要查看它们设置的值:

SELECT @@global.time_zone;
Run Code Online (Sandbox Code Playgroud)

要为其设置值,请使用以下任一项:

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';
Run Code Online (Sandbox Code Playgroud)

(使用像'Europe/Helsinki'这样的命名时区意味着您必须正确填充时区表.)

请记住,这+02:00是一个偏移量.Europe/Berlin是一个时区(有两个偏移),CEST是一个对应于特定偏移的时钟时间.

@@ session.time_zone变量

SELECT @@session.time_zone;
Run Code Online (Sandbox Code Playgroud)

设置它使用任何一个:

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
Run Code Online (Sandbox Code Playgroud)

两者都可能返回SYSTEM,这意味着他们使用my.cnf中设置的时区.

要使时区名称起作用,您必须设置需要填充的时区信息表:http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html.我还提到了如何在这个答案中填充这些表.

要将当前时区偏移量设置为 TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

如果你的时区是+2:00,它将返回02:00:00.

要获取当前的UNIX时间戳:

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());
Run Code Online (Sandbox Code Playgroud)

将timestamp列作为UNIX时间戳获取

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
Run Code Online (Sandbox Code Playgroud)

将UTC日期时间列作为UNIX时间戳获取

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
Run Code Online (Sandbox Code Playgroud)

注意:更改时区不会更改存储的日期时间或时间戳,但会显示现有时间戳列的不同日期时间,因为它们在内部存储为UTC时间戳,并在外部显示在当前MySQL时区中.

我在这里做了一个备忘单:MySQL的时区应该设置为UTC吗?

  • 在Win7中,mysql设置文件的路径是`C:\ ProgramData\MySQL\MySQL Server xx\my.ini` (4认同)
  • `+00:00`不是时区,它是时间偏移.关于夏令时会发生什么?它是否全年保持+0? (3认同)
  • @Mark 我不确定,[文档](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html) 在设置`time_zone="+00:00 时说"` 您正在使用 UTC 的偏移量设置 **timezone**,考虑到设置值永远不会改变并且 UTC 不遵循 DST,我可以假设它全年保持不变。 (2认同)

Noe*_*phy 66

对于仍有此问题的人:

value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"
Run Code Online (Sandbox Code Playgroud)

为我工作.只是追加?serverTimezone=UTC到最后.

  • 问题不在于 JDBC,而在于 MySQL 本身。 (4认同)
  • @ChiếnNghê:您应该使用Asia / Ho_Chi_Minh而不是UTC BTW,问题在于更改MySQL时区。因此,请查看@Timo答案。如果您在使用MySQL docker时遇到问题,请添加TZ环境,它应该可以工作。 (2认同)
  • 这个**只告诉**JDBC什么是服务器时区,它**不会改变它.要设置会话时区,请检查使用`SET time_zone = ...`的答案 (2认同)

小智 54

当您可以为MySQL或PHP配置时区服务器时:

记得:

  1. 更改时区系统.Ubuntu的示例:

    $ sudo dpkg-reconfigure tzdata
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重新启动服务器,或者您可以重新启动Apache 2和MySQL:

    /etc/init.d/mysql restart
    
    Run Code Online (Sandbox Code Playgroud)

  • 也许这种方法可能不是正确的方法.考虑使用UTC服务器但您的应用程序正在向UTC -0600上的国家/地区提供数据的情况.要调整MySQL的时区,可能会好得多. (2认同)
  • 特别是如果您在涵盖多个时区的地区工作。 (2认同)

Jam*_*ore 53

要为当前会话设置它,请执行以下操作:

SET time_zone = timezonename;
Run Code Online (Sandbox Code Playgroud)

  • SELECT @@ session.time_zone; (12认同)
  • 谢谢你...设置为'+00:00'对我有用! (5认同)

Ric*_*han 43

只需在MySQL服务器上运行:

SET GLOBAL time_zone = '+8:00';
Run Code Online (Sandbox Code Playgroud)

其中+8:00将是您的时区.

  • 请注意,这只是暂时的,直到您重新启动Mysql (9认同)
  • 一旦夏令时到来,当您从“+8:00”到“+9:00”(对于使用 DST 的时区)时,这将变得不准确。 (2认同)

小智 16

这对我来说是印度的一个地方:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Run Code Online (Sandbox Code Playgroud)


ham*_*ber 16

这是一个 10 年前的问题,但无论如何这对我有用。我在 Hibernate 5 和 SpringBoot 4 中使用 MySQL 8.0。

我已经尝试了上述接受的答案,但对我不起作用,对我有用的是:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw
Run Code Online (Sandbox Code Playgroud)

如果这对您有帮助,请不要忘记给它点赞:D


Ale*_*lli 10

您可以在启动时指定服务器的默认时区,请参阅http://dev.mysql.com/doc/refman/5.1/en/server-options.html,特别是该--default-time-zone=timezone选项.您可以使用检查全局和会话时区

SELECT @@global.time_zone, @@session.time_zone;
Run Code Online (Sandbox Code Playgroud)

SET语句设置其中一个或两个,&c; 有关更多详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html.


Ale*_*nin 9

请记住,"国家/地区"有时不起作用......这个问题不是操作系统,MySQL版本和硬件依赖 - 自从FreeBSD 4和Slackware Linux在2003年到今天我都遇到了它.MySQL从版本3到最新的源干线.它是ODD,但它确实发生了.例如:

root@Ubuntu# ls -la /usr/share/zoneinfo/US
total 8

drwxr-xr-x  2 root root 4096 Apr 10  2013 .
drwxr-xr-x 22 root root 4096 Apr 10  2013 ..
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Alaska -> ../SystemV/YST9YDT
lrwxrwxrwx  1 root root   21 Jul  8 22:33 Aleutian -> ../posix/America/Adak
lrwxrwxrwx  1 root root   15 Jul  8 22:33 Arizona -> ../SystemV/MST7
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Central -> ../SystemV/CST6CDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Eastern -> ../SystemV/EST5EDT
lrwxrwxrwx  1 root root   37 Jul  8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis
lrwxrwxrwx  1 root root   19 Jul  8 22:33 Hawaii -> ../Pacific/Honolulu
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Indiana-Starke -> ../posix/America/Knox_IN
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Michigan -> ../posix/America/Detroit
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Mountain -> ../SystemV/MST7MDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific-New -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   20 Jul  8 22:33 Samoa -> ../Pacific/Pago_Pago
root@Ubuntu#
Run Code Online (Sandbox Code Playgroud)

这样的声明应该起作用:

SET time_zone='US/Eastern';
Run Code Online (Sandbox Code Playgroud)

但是你有这个问题:

错误代码:1298.未知或不正确的时区:'EUS/Eastern'

查看区域信息目录中的子文件夹,查看符号链接的ACTUAL文件名,在本例中为EST5EDT.然后尝试这个语句:

SET time_zone='EST5EDT';
Run Code Online (Sandbox Code Playgroud)

它实际上正如它应该的那样工作!:)记住这个伎俩; 我还没有看到它在MySQL手册和官方文档中记录.但阅读相应的文档是必须做的事情:MySQL 5.5时区官方文档 - 并且不要忘记将时区数据加载到服务器中(就像root用户一样!):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
Run Code Online (Sandbox Code Playgroud)

特技第一 - 它必须完全在MySQL root用户下完成.它甚至可以从完全访问MySQL数据库的用户那里失败或产生非工作结果 - 我自己看到了这个故障.


MeK*_*ons 7

如果您正在使用PDO:

$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MySQLi:

$db->MySQLi->query("SET time_zone='".$offset."';");
Run Code Online (Sandbox Code Playgroud)

有关格式化偏移量的更多信息,请访问:https: //www.sitepoint.com/synchronize-php-mysql-timezone-configuration/


Iva*_*_ug 6

编辑 MySQL 配置文件

sudo nano /etc/mysql/my.cnf
Run Code Online (Sandbox Code Playgroud)

滚动并将它们添加到底部。更改为相关时区

[mysqld]
default-time-zone = "+00:00"
Run Code Online (Sandbox Code Playgroud)

重新启动服务器

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)


ina*_*lus 5

古老的问题,还有一个建议:

如果您最近更改了操作系统的时区,例如通过:

unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime
Run Code Online (Sandbox Code Playgroud)

... MySQL(或 MariaDB)在您重新启动 db 服务之前不会注意到:

service mysqld restart
Run Code Online (Sandbox Code Playgroud)

(或者)

service mariadb restart
Run Code Online (Sandbox Code Playgroud)


Eri*_*oor 5

首先要弄清楚你可以查询的 time_zone 是什么

SHOW VARIABLES LIKE '%time_zone%'; 
Run Code Online (Sandbox Code Playgroud)

您的输出应该类似于以下内容

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM
Run Code Online (Sandbox Code Playgroud)

然后,如果您想确认您所在的时区(例如 CDT)而不是 EST(东部时间),您可以检查它认为您的机器所在的时间:

SELECT NOW();
Run Code Online (Sandbox Code Playgroud)

如果这不是您想要的时间,您需要改变它......您所需要做的就是SET time_zone = timezone_name。确保它是Continent/City格式正确的。

如果您由于拥有托管服务而位于共享服务器上,请参阅有关更改 php.ini 文件或 .htaccess 文件的这些答案。


小智 5

如果您使用命名时区会导致错误:

mysql> SET GLOBAL time_zone = "Asia/Bangkok";    
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Bangkok'
Run Code Online (Sandbox Code Playgroud)

你可以试试:

mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql
Run Code Online (Sandbox Code Playgroud)

进而:

SET GLOBAL time_zone = "Asia/Bangkok";
SET time_zone = "+07:00";
SET @@session.time_zone = "+07:00";
Run Code Online (Sandbox Code Playgroud)

检查现在几点了:

SELECT NOW();
Run Code Online (Sandbox Code Playgroud)

参考: https: //dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation