如何获取MySQL的当前时区?

有人知道MySQL中有没有这样的函数吗?

更新

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

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

或者MySQL本身不能确切地知道使用的time_zone,这很好,我们可以在这里涉及PHP,只要我能得到有效的信息,而不是像SYSTEM……

499007 次浏览

检查MySQL服务器时区支持system_time_zone系统变量。这有用吗?

从手册(9.6节):

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

编辑如果MySQL被设置为使用系统时区,上面返回SYSTEM,这没什么帮助。因为你使用的是PHP,如果MySQL的答案是SYSTEM,那么你可以通过date_default_timezone_get询问系统使用的是哪个时区。(当然,正如VolkerK所指出的,PHP可能运行在不同的服务器上,但根据假设,假设web服务器和它所通信的DB服务器是设置为[如果不是]相同的时区,这就不是巨大的的飞跃。)但要注意(与MySQL一样),你可以设置PHP使用的时区(SYSTEM0),这意味着它报告的值可能与操作系统使用的值不同。如果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日(一小时后)?你根本不可能知道。寓意:始终以GMT(不使用DST)存储日期/时间,并在必要时转换为所需的时区。

下面的查询返回当前会话的时区。

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
< p >简单 SELECT @@system_time_zone; < / p >

返回PST(或任何与你的系统相关的值)。

如果你试图确定会话时区,你可以使用这个查询:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone); < / p >

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

正如Jakub Vrana(创建者或管理NotORM)在注释中提到的,要在TIME中选择当前时区偏移量,使用:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

它将返回:02:00:00如果你的时区是+2:00的日期

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

你只需要在修改系统时区后重新启动mysqld ..

MySQL的Global timezone取System的timezone。当你改变任何这样的系统属性,你只需要重新启动Mysqld。

如果你需要将GMT差值作为整数:

SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
在数据库中插入一个有时间戳的假记录 选择该记录并获取时间戳的值。 删除该记录。获取服务器写入数据时使用的时区,忽略PHP时区

可能是这样

select timediff(current_time(),utc_time())

通过这种方式,您不会直接获得时区值。

@@global.time_zone不能被使用,因为它是一个变量,并且它返回值'SYSTEM'

如果你需要使用session SET TIME_ZONE =在一个更改了时区的会话中使用你的查询,那么你将使用@@session.time_zone得到它。如果你查询@@global.time_zone,那么你会得到'SYSTEM'

如果你用now()utc_time()尝试datediffdate_subtimediff,那么你可能会遇到转换问题。

但是上面建议的东西至少可以在某些服务器版本上使用。我的版本是5.5.43-37,是一个托管解决方案。

我的PHP框架使用

SET LOCAL time_zone='Whatever'

在连接后,其中'Whatever' == 函数()

不是我的解决方案,但这确保MySQL服务器的SYSTEM时区始终与PHP的时区相同

因此,是的,PHP强烈地参与其中,并可以影响它

要获取mysql的当前时区,你可以做以下事情:

 SELECT @@system_time_zone;   # from this you can get the system timezone
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) # This will give you time zone if system timezone is different from global timezone

现在如果你想改变mysql时区,那么:

 SET GLOBAL time_zone = '+00:00';   # this will set mysql timezone in UTC
SET @@session.time_zone = "+00:00";  # by this you can chnage the timezone only for your particular session

你可以尝试以下方法:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

在这里,您可以将时差指定为秒

使用LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')获取MySQL时区格式的值,可以方便地与CONVERT_TZ()一起使用。请注意,您获得的时区偏移量仅在表达式计算的时刻有效,因为如果使用夏令时,偏移量可能会随着时间而改变。然而,该表达式与NOW()一起用于存储与本地时间的偏移量,从而消除了NOW()所产生的歧义。(在DST时区中,NOW()每年回跳一个小时,因此对于不同的时间点有一些重复的值)。

要根据您的时区获取当前时间,您可以使用以下命令(在我的示例中是'+5:30')

选择DATE_FORMAT (convert_tz(现在(),@@session.time_zone, ' + 05:30 '), Y % - % - % d ')

尝试使用以下代码:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing

描述中提到的命令返回“SYSTEM”,表示它采用服务器的时区。这对我们的查询没有用处。

下面的查询将有助于了解时区

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

以上查询将提供与协调世界时(UTC)相关的时间间隔。所以你可以很容易地分析时区。如果数据库时区是IST,则输出将是5:30

UTC_TIMESTAMP

在MySQL中,UTC_TIMESTAMP返回当前UTC日期和时间,作为'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS的值。Uuuuuu格式取决于函数的用法,即在字符串或数字上下文中。

现在()

现在()函数。MySQL NOW()以'YYYY-MM-DD HH:MM:SS'格式或YYYYMMDDHHMMSS返回当前日期和时间的值。Uuuuuu格式,取决于函数的上下文(数字或字符串)。CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, LOCALTIMESTAMP()是NOW()的同义词。

任何人来查找mysql数据库的时区。

通过这个查询,你可以得到当前的时区:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+


这不是对这个问题的直接回答,但这篇博客文章提供了关于这个主题的有价值的信息:

https://danuka-praneeth.medium.com/guide-to-time-zones-conversion-between-zones-and-storing-in-mysql-da4fc4350cd9

引用博客文章:

在MySQL5+中,TIMESTAMP值从会话时区转换而来 存储从UTC到会话时区 检索。但是DATETIME不做任何转换