如何设置MySQL的时区?

时间:2009-05-31 00:02:07

标签: mysql timezone

在一台服务器上,当我跑:

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)

22 个答案:

答案 0 :(得分:434)

我认为这可能有用:

在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。我还提到了如何在this answer中填充这些表。

将当前时区偏移量设为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`

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

我在这里制作了一张备忘单:Should MySQL have its timezone set to UTC?

答案 1 :(得分:50)

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

SET time_zone = timezonename;

答案 2 :(得分:47)

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

记住:

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

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

    /etc/init.d/mysql restart
    

答案 3 :(得分:37)

对于仍有此问题的人:

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

为我工作。只需在最后添加?serverTimezone=UTC

答案 4 :(得分:36)

只需在MySQL服务器上运行:

SET GLOBAL time_zone = '+8:00';

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

答案 5 :(得分:14)

这项工作适合我在印度的一个地方:

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

答案 6 :(得分:9)

您可以在启动时指定服务器的默认时区,请参阅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

答案 7 :(得分: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#

这样的陈述应该有效:

SET time_zone='US/Eastern';

但是你有这个问题:

  

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

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

SET time_zone='EST5EDT';

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

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

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

答案 8 :(得分:6)

如果你正在使用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/

答案 9 :(得分:4)

古代问题还有一个建议:

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

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

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

service mysqld restart

(或)

service mariadb restart

答案 10 :(得分:3)

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

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

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

答案 11 :(得分:1)

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

答案 12 :(得分: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表!

答案 13 :(得分:1)

Edit the MySQL config file

sudo nano /etc/mysql/my.cnf

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

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

重新启动服务器

sudo service mysql restart

答案 14 :(得分:1)

通过登录到 mysql 服务器在服务器上设置 MYSQL 时区,根据需要设置时区值。对于 IST

SET SESSION time_zone = '+5:30';

然后运行SELECT NOW();

答案 15 :(得分:0)

首先要弄清楚您可以查询的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格式的文件。

如果由于拥有托管服务而在共享服务器上,请参阅these answers,以了解如何更改php.ini文件或.htaccess文件。

答案 16 :(得分:0)

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

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

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

答案 17 :(得分:0)

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

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

答案 18 :(得分: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

答案 19 :(得分:0)

在服务器选项卡下的MySQL Workbench 8.0中,如果转到状态和系统变量,则可以在此处进行设置。

enter image description here

答案 20 :(得分:0)

如果符合您的方案,您可以通过更改操作系统时区轻松完成此操作。

在 Ubuntu 中,要列出时区,请运行此命令

sudo timedatectl list-timezones

要更改操作系统时区,请使用您的时区运行此命令

timedatectl set-timezone America/New_York

检查操作系统时区,运行

date

然后重启MySQL

sudo service mysql restart

在MySQL中查看时区,登录并运行

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

答案 21 :(得分:-3)

您必须设置您的位置时区。所以按照以下流程进行 打开MSQLWorkbench 写一个像这样的简单sql命令;

select now();

你的网址也可能是这样的;

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