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

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_zone变量

要查看它们被设置为什么值:

SELECT @@global.time_zone;

要为它设置一个值,可以使用其中任何一个:

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

(使用像“欧洲/赫尔辛基”这样的命名时区意味着你必须有一个正确填充的时区表。)

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

@@session。time_zone变量

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`

获取一个UTC datetime列作为UNIX时间戳

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

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

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

其他回答

如果使用指定时区会导致错误:

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

你可以试试:

mysql_tzinfo_to_sql tz_file tz_name | mysql -u root -p mysql

然后:

SET GLOBAL time_zone = "Asia/Bangkok";
SET time_zone = "+07:00";
SET @@session.time_zone = "+07:00";

检查一下现在几点了:

SELECT NOW();

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

请记住,“国家/地区”有时不起作用……这个问题与操作系统、MySQL版本和硬件无关——我从2003年FreeBSD 4和Slackware Linux到今天都遇到过这个问题。MySQL从版本3到最新的源中继。这很奇怪,但确实发生了。例如:

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/Eastern”

查看区域信息目录中的子文件夹,并查看符号链接的实际文件名,在本例中为EST5EDT。那就试试下面这句话:

SET time_zone='EST5EDT';

而且它确实像它应该的那样工作!:)记住这个技巧;我还没有在MySQL手册和官方文档中看到它的文档。但是阅读相应的文档是必须要做的事情:MySQL 5.5时区官方文档-不要忘记像这样将时区数据加载到服务器中(以root用户运行!):

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

技巧1 -它必须完全在MySQL根用户下完成。即使用户对MySQL数据库有完全的访问权限,它也可能失败或产生无法工作的结果-我自己看到了故障。

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

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

unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime

... MySQL(或MariaDB)直到重启db服务才会发现:

service mysqld restart

(or)

service mariadb restart

要为当前会话设置它,请执行:

SET time_zone = timezonename;

这是一个10年前的问题,但不管怎样,这里有一个对我有用的方法。我使用MySQL 8.0与Hibernate 5和SpringBoot 4。

我试过上面的答案,但对我不起作用,对我有效的是:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

如果这对你有帮助,别忘了给它投票