MySQL应该将其时区设置为UTC吗?
人权的后续问题 MySQL时区应该设置为UTC还是应该设置为与服务器或PHP设置相同的时区?(如果不是UTC)MySQL应该将其时区设置为UTC吗?,mysql,time,utc,Mysql,Time,Utc,人权的后续问题 MySQL时区应该设置为UTC还是应该设置为与服务器或PHP设置相同的时区?(如果不是UTC) 利与弊是什么?利与弊几乎相同。这取决于你是否想要这个 请小心,如果MySQL时区与您的系统时间(例如PHP)不同,则将时间或打印内容与用户进行比较需要进行一些修改。PHP和MySQL有自己的默认时区配置。您应该同步数据库和web应用程序之间的时间,否则可能会出现一些问题 阅读本教程:服务器上的时区似乎无关紧要,只要您为当前时区设置了正确的时间,知道存储的日期时间列的时区,并且知道夏令
利与弊是什么?利与弊几乎相同。这取决于你是否想要这个
请小心,如果MySQL时区与您的系统时间(例如PHP)不同,则将时间或打印内容与用户进行比较需要进行一些修改。PHP和MySQL有自己的默认时区配置。您应该同步数据库和web应用程序之间的时间,否则可能会出现一些问题
阅读本教程:服务器上的时区似乎无关紧要,只要您为当前时区设置了正确的时间,知道存储的日期时间列的时区,并且知道夏令时的问题 另一方面,如果您可以控制与您一起工作的服务器的时区,那么您可以在内部将所有内容设置为UTC,而不必担心时区和DST 以下是我收集的一些关于如何使用时区的笔记,作为我自己和其他人的备忘单,这些备忘可能会影响此人为其服务器选择的时区以及他/她将如何存储日期和时间 MySQL时区备忘单 注:
SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`
您还可以将服务器或全局或当前会话时区设置为UTC,然后选择时间戳,如下所示:
SELECT `timestamp_field` FROM `table_name`
要选择UTC中的当前日期时间,请执行以下操作:
示例结果:2015-03-2417:02:41
在会话时区中选择当前日期时间
选择服务器启动时设置的时区
返回莫斯科时间的“MSK”或“+04:00”。例如,存在(或曾经存在)一个MySQL错误,如果设置为数字偏移,则不会调整夏令时
获取当前时区的步骤
如果您的时区为+2:00,它将返回02:00:00
要获取当前UNIX时间戳(以秒为单位):
以UNIX时间戳的形式获取时间戳列
获取UTC日期时间列作为UNIX时间戳的步骤
从正UNIX时间戳整数获取当前时区datetime
从UNIX时间戳获取UTC日期时间
从负UNIX时间戳整数获取当前时区datetime
MySQL中有3个地方可以设置时区:
注:时区可设置为两种格式:
SELECT @@global.time_zone;
要为其设置值,请使用以下任一选项:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
@@session.time\u区域变量
要设置它,请使用以下任一选项:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
“@@global.time_zone variable”和“@@session.time_zone variable”都可能返回“SYSTEM”,这意味着它们使用“my.cnf”中设置的时区
要使时区名称起作用(即使是默认时区),您必须设置需要填充的时区信息表:
注意:您不能执行此操作,因为它将返回空值:
SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`
设置mysql时区表
要使转换工作,您需要填充时区表
SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;
如果它们是空的,则通过运行此命令来填充它们
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
如果此命令给出错误“”,则可能是由于在时区缩写的末尾附加了空字符造成的
解决方法是运行此
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
CONVERT_z
还根据上表中的规则和您使用的日期应用任何必要的DST更改
注意:根据,您为时区设置的值不会更改,例如,如果您将其设置为“+01:00”,则时区将设置为UTC的偏移量,而UTC不遵循DST,因此它将全年保持不变 在夏令时期间,只有指定的将更改时间 像
CET
这样的缩写词将始终是冬季时间,CEST
将是夏季时间,+01:00将始终是UTC
time+1小时,两者都不会随DST而改变
系统
时区将是安装mysql的主机的时区(除非mysql无法确定)
您可以阅读有关使用DST的更多信息
相关问题:
-
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
default_time_zone='+00:00'
timezone='UTC'
SELECT @@global.time_zone;
SET GLOBAL time_zone = '+8:00'; SET GLOBAL time_zone = 'Europe/Helsinki'; SET @@global.time_zone='+00:00';
SELECT @@session.time_zone;
SET time_zone = 'Europe/Helsinki'; SET time_zone = "+00:00"; SET @@session.time_zone = "+00:00";
SELECT CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime` FROM `table_name`
SELECT * FROM mysql.`time_zone` ; SELECT * FROM mysql.`time_zone_leap_second` ; SELECT * FROM mysql.`time_zone_name` ; SELECT * FROM mysql.`time_zone_transition` ; SELECT * FROM mysql.`time_zone_transition_type` ;
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql (if the above gives error "data too long for column 'abbreviation' at row 1") mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
SELECT tzn.Name AS tz_name, tztt.Abbreviation AS tz_abbr, tztt.Is_DST AS is_dst, tztt.`Offset` AS `offset`, DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND) AS transition_date FROM mysql.`time_zone_transition` tzt INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id) INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id) -- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes ORDER BY tzt.Transition_time ASC
jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Europe/Moscow
// Storing dates $date = new DateTime('now', new DateTimeZone('UTC')); $sql = 'insert into table_name (date_column) values ("' . $date . '")'; // Retreiving dates $sql = 'select date_column from table_name where condition'; $dateInUTC = new DateTime($date_string_from_db, new DateTimeZone('UTC'));