当前位置: 首页 > 面试题库 >

如何获取MySQL的当前时区?

子车俊材
2023-03-14
问题内容

有人知道MySQL中是否有这样的功能吗?

更新

这不会输出任何有效的信息:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

或者也许MySQL本身不知道确切time_zone使用了什么,那很好,我们可以PHP在这里介入,只要我能获得不像SYSTEM


问题答案:

从手册(第9.6节):

可以按以下方式检索全局时区和特定于客户时区的当前值:
mysql> SELECT @@global.time_zone, @@session.time_zone;

编辑SYSTEM如果MySQL设置为系统时区的从属,则以上内容将返回,没有帮助。由于您使用PHP,如果从MySQL的答案是SYSTEM,你可以接着问什么时区系统

通过使用date_default_timezone_get。(当然,正如VolkerK指出的那样,PHP可能在不同的服务器上运行,但是按照假设,假设要与之通信的Web服务器和DB服务器 设置为
[如果实际上不在同一时区 ] 巨大的
飞跃。)但要注意(如MySQL的),你可以设置时区PHP使用(date_default_timezone_set),这意味着它可能报告的值与操作系统正在使用的值不同。如果您可以控制PHP代码,则应该知道自己是否正在这样做,并且可以。

但是关于MySQL服务器使用哪个时区的整个问题可能是切线,因为询问服务器它所在的时区 绝对不会 告诉您关于数据库中数据任何
信息。继续阅读以获取详细信息:

进一步讨论

当然,如果您控制服务器,则可以确保时区为已知数量。如果您不受服务器的控制,则可以这样设置 连接 使用的时区:

set time_zone = '+00:00';

这样now()会将时区设置为GMT,以便任何进一步的操作(如)都将使用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()等;
它不会告诉您数据库数据中的日期正在使用哪个时区。您可能会选择 假设
它们是使用服务器的时区编写的,但是这种假设很可能是有缺陷的。要知道数据中存储的任何日期或时间的时区,您必须确保它们与时区信息一起存储,或者(就像我一样)确保它们始终位于格林尼治标准时间。

为什么假设数据是使用服务器的时区写入的?好吧,一方面,数据可能是使用设置了不同时区的连接写入的。该数据库可能已从一台服务器移至另一台服务器,其中服务器位于不同的时区(当我继承从德克萨斯州移至加利福尼亚州的数据库时遇到了这种情况)。但是,
即使
将数据写入服务器(具有当前时区),它仍然是模棱两可的。去年,在美国,夏令时于11月1日凌晨2:00被关闭。假设我的服务器使用太平洋时区在加利福尼亚州,我有这个价值2009-11-01 01:30:00在数据库中。那是什么时候?是太平洋标准时间11月1日凌晨1:30,还是太平洋标准时间11月1日凌晨1:30(一个小时后)?您绝对无法知道。道德:始终将日期/时间存储在GMT中(不执行DST),并在必要时将其转换为所需的时区。



 类似资料:
  • 问题内容: 是否可以在手动查询中使用诸如DATETIME之类的值或命令来插入当前日期和时间? 末尾引用的DATETIME值是我要添加当前日期和时间的位置。 问题答案: 您可以使用:

  • 问题内容: 我想获取UTC的当前时间。我到目前为止所做的是(仅出于测试目的): 是我的当地时间,那很好 是我的本地时间+ 1,但应该是本地时间-1 … 我的本地时区是UTC + 1(根据调试输出和此处的列表:https : //www.joda.org/joda- time/timezones.html )… 如何正确地从一个时区转换为另一个时区(包括毫秒表示)? 编辑 我需要日期/毫秒…这不是正

  • 问题内容: 如何使用Java获取当前日期和时间? 我正在寻找与C#等效的东西。 问题答案: 只需构造一个没有任何参数的新对象即可;这会将当前日期和时间分配给新对象。 在的话的Javadoc的无参数的构造函数: 分配一个Date对象并对其进行 初始化,以便它表示分配它的时间( 以最近的毫秒为单位)。 确保您使用的不是-后者没有零参数构造函数,并且语义有所不同,这是完全不同的对话的主题。:)

  • 问题内容: 获取当前时间的模块/方法是什么? 问题答案: 采用: 而只是时间: 有关更多信息,请参见文档。 要保存输入,可以datetime从datetime模块中导入对象: 然后datetime.从以上所有位置移除引线。

  • 当前文档只讨论获取路由参数,而不是实际的路由段。 例如,如果我想找到当前路由的父级,怎么可能?

  • 我正在访问在woocommerce上显示我的产品(与woocommerce中的正常流程类似)。 在存档产品页面上。php我已经添加了侧边栏和我的商店拥有的所有产品类别(有或没有产品)。我使用了以下代码来执行此操作: 现在页面的左侧有上面的侧边栏,右侧有产品。在每个产品类别中,我都添加了一个带有html格式的小说明,我希望在用户单击该类别时显示该说明。根据woocommerce,当您进入特定类别时(