在一台服务器上,当我跑:
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)
答案 0 :(得分:434)
我认为这可能有用:
default-time-zone='+00:00'
要查看它们设置的值:
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
是与特定偏移量对应的时钟时间。
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。
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
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配置时区服务器:
记住:
更改时区系统。 Ubuntu示例:
$ sudo dpkg-reconfigure tzdata
重新启动服务器,或者您可以重新启动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)
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)
答案 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";