我如何设置MySQL的时区?

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

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

在其他服务器上:

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

我认为这可能是有用的:

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

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

 default-time-zone='+00:00' 

@@ global.time_zonevariables

要查看它们设置的值:

 SELECT @@global.time_zone; 

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

 SET GLOBAL time_zone = '+8:00'; SET GLOBAL time_zone = 'Europe/Helsinki'; SET @@global.time_zone = '+00:00'; 

(使用像“欧洲/赫尔辛基”这样的指定时区就意味着你必须有一个正确的时区表。

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

@@ session.time_zonevariables

 SELECT @@session.time_zone; 

要设置它使用任一:

 SET time_zone = 'Europe/Helsinki'; SET time_zone = "+00:00"; SET @@session.time_zone = "+00:00"; 

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

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

获取当前时区偏移量为TIME

 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

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

获取当前的UNIX时间戳:

 SELECT UNIX_TIMESTAMP(); SELECT UNIX_TIMESTAMP(NOW()); 

获取时间戳列作为UNIX时间戳

 SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name` 

获取UTCdate时间列作为UNIX时间戳

 SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name` 

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

我在这里做了一个cheatsheet: 如果MySQL的时区设置为UTC?

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

 SET time_zone = timezonename; 

当您可以为MySQL或PHPconfiguration时区服务器时:

记得:

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

     $ sudo dpkg-reconfigure tzdata` 
  2. 重新启动服务器,或者重新启动Apache 2和MySQL:

     `/etc/init.d/mysql restart` 

只需在MySQL服务器上运行它:

 SET GLOBAL time_zone = '+8:00'; 

哪里+8:00将是你的时区。

对于任何人仍然有这个问题:

 value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC" 

为我工作。 在最后附加?serverTimezone=UTC

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

 SELECT @@global.time_zone, @@session.time_zone; 

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

这工作对我来说在印度的一个位置:

 SET GLOBAL time_zone = "Asia/Calcutta"; SET time_zone = "+05:30"; SET @@session.time_zone = "+05:30"; 

请记住,“国家/地区”有时候不起作用…这个问题不是操作系统,MySQL版本和硬件依赖 – 自从2003年FreeBSD 4和Slackware Linux到今天,我已经遇见过它。 从版本3 MySQL到最新的源主干。 这是奇怪的,但它确实发生。 例如:

 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# 

像这样的陈述应该是有效的:

 SET time_zone='US/Eastern'; 

但是你有这个问题:

错误代码:1298.未知或不正确的时区:“EUS /东部”

查看您的区域信息目录中的子文件夹,并查看符号链接的ACTUAL文件名,在这种情况下,它是EST5EDT。 然后尝试这个声明:

 SET time_zone='EST5EDT'; 

它实际上是按照它应该的工作的! :)记住这个把戏; 我没有看到它在MySQL手册和官方文档中有logging。 但是阅读相应的文档是必须做的事情: MySQL 5.5时区官方文档 – 不要忘记加载时区数据到你的服务器就像那样(以root用户身份运行!):

 mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 

招数一 – 它必须完全在MySQL根用户下完成。 即使是从完全访问MySQL数据库的用户那里,它也可能会失败或产生非工作结果 – 我自己也看到了这个故障。

如果您正在使用MySql Workbench ,则可以通过打开pipe理员视图并select高级选项卡来进行设置。 顶部是“本地化”,第一个checkbox应该是“默认时区”。 选中该框,然后input所需的时区,重新启动服务器,你应该很好去。

你必须设置你的位置时区。 所以按照下面的stream程
打开你的MSQLWorkbench写一个简单的sql命令就可以了;

 select now(); 

如果您使用的是PDO:

 $offset="+10:00"; $db->exec("SET time_zone='".$offset."';"); 

如果你正在使用MySQLi:

 $db->MySQLi->query("SET time_zone='".$offset."';"); 

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