如何设置MySQL的时区?


339

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

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)

这里不仅有时区差异,而且时间漂移也不是那么微不足道:“与您的DBA交流ntp-看看最适合您的!”
colm.anseo,

@ colm.anseo冷静下来,这可能是运行查询之间的区别
HosseyNJF

1
@HosseyNJF到7分钟?比较之间喝咖啡休息时间?
colm.anseo

Answers:


524

我认为这可能有用:

在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';

(使用诸如“ Europe / Helsinki”之类的命名时区意味着您必须正确填充时区表。)

请记住,这+02:00是一个偏移量。Europe/Berlin是一个时区(具有两个偏移量),并且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());

将timestamp列获取为UNIX时间戳

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

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

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

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

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


3
+00:00不是时区,而是时间偏移。关于DST,会发生什么?全年是否保持+0?
mpen 2014年

1
@Mark我不确定,文档time_zone="+00:00"您在设置使用的是与UTC的偏移量来设置时区,考虑到设置值永不更改并且UTC不遵循DST,我可以假设它全年都保持不变。
Timo Huovinen 2014年

1
@TimoHuovinen对不起,我的意思是+00:00 看起来像是一个偏移量,因此MySQL选择使用它来表示UTC而不是仅使用字符串“ UTC”本身就有点奇怪。谢谢(你的)信息。
mpen 2014年

1
我设置+00:00,但我得到这个错误:错误:找到的选项前没有组配置文件:/etc/my.cnf中
亚诺什

5
在Win7中,mysql设置文件的路径为C:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca 2014年

82

对于仍然有此问题的任何人:

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

为我工作。只需?serverTimezone=UTC在末尾追加即可。


如果我的时区是UTC + 7,如何在连接字符串中指定?我尝试附加“?serverTimezone = UTC + 7”,但它不起作用。
简义安

1
问题不在于JDBC,而是MySQL本身。
Luiz

2
@ChiếnNghê:您应该使用BTW Asia/Ho_Chi_Minh代替UTC,问题在于更改MySQL时区。因此,请查看@Timo答案。如果您在使用MySQL docker时遇到问题,请添加TZ环境,它应该可以工作。
Liem Le

2
仅通知 JDBC服务器时区是什么,而不更改它。要设置会话时区,请检查使用的答案SET time_zone=...
NikolaMihajlović18年

我遇到了CDT错误,但这对我来说已经解决了。
Akexis

58

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

记得:

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

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

    /etc/init.d/mysql restart

2
也许这种方法可能不合适。考虑使用具有UTC的服务器但您的应用程序正在将数据提供给UTC -0600所在国家/地区的情况。调整MySQL的时区可能会更好。
ivanleoncz

1
特别是当您在一个覆盖多个时区的区域中工作时。
亚历克西斯·威尔克

57

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

SET time_zone = timezonename;

14
选择@@ session.time_zone;
詹姆斯·斯基德莫尔

1
我正在尝试修复系统上的一些错误,并且需要将time_zone设置为UTC,而不是GMT。您知道我设置为“ -0:00”还是“ +00:00”吗?这是UTC注释还是GMT注释?我有点找不到此特定信息。干杯!
rafa.ferreira 2011年

@Castanho,我敢肯定任何一个都可以正常工作。退房说明这个问题:stackoverflow.com/questions/3466630/...
詹姆斯斯基德莫尔

时区的值可以与PHP中的值相同,例如SET time_zone = 'America/Boise'。感谢您的回答,James Skidmore!
亚当F

1
@the_nuts是的,SET time_zone = 'UTC';服务器重启期间设置丢失
Timo Huovinen

48

只需在您的MySQL服务器上运行此命令即可:

SET GLOBAL time_zone = '+8:00';

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


14
请注意,这只是暂时的,直到您重新启动Mysql为止
rubo77

连接到数据库时,很少有超级用户特权。@@session.time_zone如其他答案所述进行设置是更好的方法。
colm.anseo

16

这对我来说适合在印度的位置:

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

您需要在mysql上以查询方式运行它,或使用以下语法default-time-zone ='
+05:30


11

请记住,“国家/地区”有时不起作用...此问题与操作系统,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 / Eastern'

查看您的区域信息目录中的子文件夹,并查看符号链接的ACTUAL文件名,在本例中为EST5EDT。然后尝试使用以下语句:

SET time_zone='EST5EDT';

它实际上正在按预期的方式工作!:)记住这个技巧;我还没有看到它在MySQL手册和官方文档中有记录。但是必须阅读相应的文档:MySQL 5.5时区官方文档 -并且不要忘记像那样将时区数据加载到服务器中(以root用户身份运行!):

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

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


请告诉我您的一致-a和更多详细信息-在Ubuntu桌面和服务器上有一些可行的案例。
Alexey Vesnin 2014年


7

这是一个已有10年历史的问题,但无论如何,这对我有用。我正在将MySQL 8.0与Hibernate 5和SpringBoot 4一起使用。

我已经尝试了上面接受的答案,但对我没有用,对我有用的是:

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

如果您有帮助,请不要忘记投票:D


4

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

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

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

...在重新启动数据库服务之前,MySQL(或MariaDB)不会注意到:

service mysqld restart

(要么)

service mariadb restart

3

如果使用的是MySql Workbench,则可以通过打开管理员视图并选择“高级”选项卡来进行设置。顶部是“本地化”,第一个复选框应该是“默认时区”。选中该框,然后输入所需的时区,重新启动服务器,您应该一切顺利。


2
该问题与MySQL有关,与特定程序无关。
fedorqui'SO停止伤害

3
一无所获。
卡扎伊

1
没什么
Green

对于MySQL Workbench 6.3:实例=>选项文件=>常规=>国际
paulus

5
[ 对于MySQL Workbench 8.0的更新 ]选择“服务器” =>“选项文件”,然后在“常规” 选项卡上的“国际” 部分下查看。将会有“默认时区”复选框以及相关字段。因此,您可以在此处设置默认时区值。
informatik01

3

首先弄清楚您可以查询什么time_zone

SHOW VARIABLES LIKE '%time_zone%'; 

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

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

然后,如果您想确认自己处于CDT之类的时区而不是EST之类,则可以通过说出它认为您的计算机处于什么时间来

SELECT NOW();

如果不是您想要的时间,那么您需要更改它...您所需要做的就是SET time_zone = timezone_name。确保它是一种Continent/City格式。

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


1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p E先尝试过,然后SET time_zone = timezone_name工作正常。
Barakat Turki

1

您必须设置您的位置时区。这样遵循以下过程
打开您的MSQLWorkbench,编写一个像这样的简单sql命令;

select now();

而且您的网址可能是这样;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";

@LuFFy这是我想知道的,因此,如果我们使用的是会话范围时区,而不是“全局”范围时区,则必须为每个数据库连接设置时区。如果应用程序可以让用户位于不同的时区,那么使用session-scope很好,对吗?
Valter Ekholm,

1

要在MariaDB上设置标准时区,您必须转到50-server.cnf文件。

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

然后,您可以在mysqld部分中输入以下条目。

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

例:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

### Default timezone ###
default-time-zone='+01:00'

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

必须通过配置文件进行更改,否则MariaDB服务器将在重启后重置mysql表!


1

编辑MySQL配置文件

sudo nano /etc/mysql/my.cnf

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

[mysqld]
default-time-zone = "+00:00"

重新启动服务器

sudo service mysql restart

0

在Windows(IIS)上,为了能够设置GLOBAL time_zone ='Europe / Helsinki'(或其他),需要首先填充MySQL time_zone描述表。

我从此链接https://dev.mysql.com/downloads/timezones.html下载了这些文件

运行下载的SQL查询后,我可以设置GLOBAL time_zone并解决我在SELECT NOW()中遇到的问题;返回GMT而不是BST。


我认为我可以使用数字格式“ +01:00”代替“欧洲/斯德哥尔摩”,所以我不需要下载time_zone描述表。
Valter Ekholm,

0

就我而言,解决方案是将“高级”设置中的serverTimezone参数设置为适当的值(我的时区为CET)。

当我使用IntelliJ时,我使用了它的数据库模块。在向数据库添加新连接时,以及在“常规”选项卡中添加了所有相关参数之后,“测试连接”按钮均出现错误。同样,解决方案是在“高级”选项卡中设置serverTimezone参数。


0

如果有人在使用GoDaddy共享主机,则可以尝试以下对我有用的解决方案。

启动数据库连接时,在我的PDO对象中设置time_zone命令,例如:

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

其中“ +05:30”是印度的时区。您可以根据需要进行更改。

之后; 所有与日期和时间有关的MySQL进程都设置了所需的时区。

来源:https : //in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.