为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取MySQL的当前时区?

如何获取MySQL的当前时区?

慕斯王 2019-07-25 19:48:14
如何获取MySQL的当前时区?谁知道MySQL中是否有这样的功能?UPDATE这不会输出任何有效信息:mysql> SELECT @@global.time_zone, @@session.time_zone;+--------------------+---------------------+| @@global.time_zone | @@session.time_zone |+--------------------+---------------------+| SYSTEM             | SYSTEM              |+--------------------+---------------------+或者也许MySQL本身无法准确知道所time_zone使用的,那很好,我们可以参与PHP这里,只要我能得到有效的信息不喜欢SYSTEM......
查看完整描述

3 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

从手册(第9.6节):

可以像下面这样检索全局和客户端特定时区的当前值: 
mysql> SELECT @@global.time_zone, @@session.time_zone;

编辑SYSTEM如果将MySQL设置为系统时区的slave,则上面返回,这不太有用。由于您使用的是PHP,如果MySQL的答案是SYSTEM,您可以询问系统使用的时区date_default_timezone_get。(当然,正如VolkerK所指出的那样,PHP可能在不同的服务器上运行,但是假设,假设它正在与之交谈的Web服务器和数据库服务器设置为 [如果不是实际存在 ]同一时区不是巨大的飞跃。)但要注意(与MySQL一样),您可以设置PHP使用的时区(date_default_timezone_set),这意味着它可能报告与操作系统使用的值不同的值。如果您掌握了PHP代码,那么您应该知道自己是否这样做并且没问题。

但是MySQL服务器正在使用的时区的整个问题可能是切线,因为询问服务器它所在的时区对数据库中的数据一无所知。继续阅读详情:

进一步讨论

如果您控制服务器,当然可以确保时区是已知数量。如果您无法控制服务器,可以设置连接使用的时区,如下所示:

set time_zone = '+00:00';

这将时区设置为GMT,以便任何进一步的操作(如now())将使用GMT。

但请注意,时间和日期值不会与MySQL中的时区信息一起存储:

mysql> create table foo (tstamp datetime) Engine=MyISAM;

Query OK, 0 rows affected (0.06 sec)


mysql> insert into foo (tstamp) values (now());

Query OK, 1 row affected (0.00 sec)


mysql> set time_zone = '+01:00';

Query OK, 0 rows affected (0.00 sec)


mysql> select tstamp from foo;

+---------------------+

| tstamp              |

+---------------------+

| 2010-05-29 08:31:59 |

+---------------------+

1 row in set (0.00 sec)


mysql> set time_zone = '+02:00';

Query OK, 0 rows affected (0.00 sec)


mysql> select tstamp from foo;

+---------------------+

| tstamp              |

+---------------------+

| 2010-05-29 08:31:59 |      <== Note, no change!

+---------------------+

1 row in set (0.00 sec)


mysql> select now();

+---------------------+

| now()               |

+---------------------+

| 2010-05-29 10:32:32 |

+---------------------+

1 row in set (0.00 sec)


mysql> set time_zone = '+00:00';

Query OK, 0 rows affected (0.00 sec)


mysql> select now();

+---------------------+

| now()               |

+---------------------+

| 2010-05-29 08:32:38 |      <== Note, it changed!

+---------------------+

1 row in set (0.00 sec)

因此,了解服务器的时区是在该得到的时间,现在的功能,如条款唯一重要的now()unix_timestamp()等等; 它没有告诉您有关数据库数据中的日期使用的时区的任何信息。您可以选择假设它们是使用服务器的时区编写的,但这种假设可能存在缺陷。要知道存储在数据中的任何日期或时间的时区,您必须确保它们与时区信息一起存储或(如我所知)确保它们始终处于GMT状态。

为什么假设数据是使用服务器的时区写的?嗯,首先,数据可能是使用设置不同时区的连接编写的。数据库可能已从一个服务器移动到另一个服务器,其中服务器位于不同的时区(当我继承了从德克萨斯州搬到加利福尼亚州的数据库时,我遇到了这个问题)。但即使数据写在服务器上,当前的时区也是如此,它仍然是模棱两可的。去年,在美国,夏令时于11月1日凌晨2点被关闭。假设我的服务器使用太平洋时区在加利福尼亚,我有值2009-11-01 01:30:00在数据库中。那是什么时候?这是太平洋标准时间11月1日凌晨1:30,或太平洋标准时间11月1日凌晨1:30(一小时后)?你完全没办法知道。道德:始终将日期/时间存储在GMT(不执行DST)并在必要时转换为所需的时区。


查看完整回答
反对 回复 2019-07-25
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

只是 SELECT @@system_time_zone;

返回PST(或与您的系统相关的任何内容)。

如果您要确定会话时区,可以使用此查询:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

如果会话时区与系统时区不同,则返回会话时区。


查看完整回答
反对 回复 2019-07-25
  • 3 回答
  • 0 关注
  • 1145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信