https://serverfault.com/questions/191331/should-servers-have-their-timezone-
set-to-gmt-utc的
后续问题
是将MySQL时区设置为UTC还是将其设置为与服务器或PHP相同的时区?(如果不是UTC)
优缺点都有什么?
只要您为当前时区设置了正确的时间,知道您存储的datetime列的时区,并且知道夏时制的问题,服务器上的时区似乎就没有关系。
另一方面,如果您可以控制所使用服务器的时区,则可以在内部将所有内容设置为UTC,而不必担心时区和DST。
以下是我收集的一些注意事项,这些注意事项涉及如何使用时区作为自己和他人的备忘单的形式,这可能会影响该人将为其服务器选择哪个时区以及他/她将如何存储日期和时间。
笔记:
GMT混淆了秒,这就是发明UTC的原因。
警告! 由于夏令时,不同的区域时区可能会产生相同的日期时间值
由于受限制,因此timestamp列仅支持1970-01-01 00:00:01到2038-01-19 03:14:07 UTC日期。
在时间戳中存储日期时,MySQL将假定该日期在当前会话时区中,并将其转换为UTC进行存储。
无论当前MySQL会话位于哪个时区:
SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`
您还可以将服务器或全局或当前会话时区设置为UTC,然后选择时间戳,如下所示:
SELECT `timestamp_field` FROM `table_name`
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');
结果示例: 2015-03-24 17:02:41
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();
SELECT @@system_time_zone;
例如,在莫斯科时间返回“ MSK”或“ +04:00”,这是一个(或曾经是)一个MySQL错误,如果将其设置为数值偏移量,则不会调整夏令时
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
如果您的时区为+2:00,它将返回02:00:00。
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`
SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00')
FROM `table_name`
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
注意:时区可以两种格式设置:
仅当已创建并填充mysql数据库中的时区信息表时,才能使用命名时区。
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";
“ @@ global.time_zone变量”和“ @@ session.time_zone变量”都可能返回“ SYSTEM”,这意味着它们使用在“
my.cnf”中设置的时区。
为了使时区名称起作用(即使对于默认时区也是如此),您必须设置时区信息表: http
:
//dev.mysql.com/doc/refman/5.1/en/time-zone-support。
html
注意:您不能执行此操作,因为它将返回NULL:
SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`
为了CONVERT_TZ
工作,您需要填充时区表
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
如果此命令给您错误“ 数据在行1的列’缩写’时过长
”,则可能是由于在时区缩写的末尾附加了NULL字符引起的
解决此问题的方法
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
(确保您的服务器dst规则是最新的zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-
linux/)
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
CONVERT_TZ
还会根据上表中的规则和使用日期应用所有必要的DST更改。
注意:
根据docs,您为time_zone设置的值不会更改,例如,如果将其设置为“
+01:00”,则time_zone将设置为UTC的偏移量,它不遵循DST,因此它将全年保持不变。
在夏令时期间,只有指定的时区会更改时间。
像这样的缩写CET
将始终是冬季时间,CEST
将是夏季时间,而+01:00则始终是UTC
时间+ 1小时,并且两者都不会随着DST更改。
的system
时区将被安装的MySQL,其中主机的时区(除非MySQL的失败来确定它)
您可以在此处阅读有关使用DST的更多信息
相关问题:
资料来源:
利弊何在?
问题内容: 我需要更改单个数据库的时区吗? 我知道我们可以在WHM中更改时区(我们正在使用hostgator的专用服务器),但是服务器上运行的大量旧版软件中有很多+6小时的编码(即服务器时区为CST,需要GMT时间,因此以前的开发人员会在代码中手动更改日期/时间- 很糟糕!)。 我现在正在开发一个新软件,并希望将其全部保存在GMT中,我知道我可以使用date_default_timezone_se
问题内容: 帮助我与同事解决争执:在Java中将变量或集合设置为null是否有助于垃圾回收并减少内存使用?如果我有一个运行时间较长的程序,并且每个函数都可能被迭代调用(可能数千次):在将值返回给父函数之前将其中的所有变量设置为null是否有助于减少堆大小/内存使用量? 问题答案: 那是旧的表演传奇。在1.0天之内确实如此,但是对编译器和JVM进行了改进以消除这种需求(如果有的话)。如果您感兴趣,这
我有一个mysql 5.7 docker容器。当我运行mysql命令时: 它显示了我当前时间的3小时(这是合乎逻辑的)。我想在配置文件中设置时区。遵循中的文档https://hub.docker.com/_/mysql/我在我的文件如下所示: 当我浏览容器中的文件时,文件。在该文件中,我尝试了一些解决方案,如: 或者是一种折衷方案,因为该区域每年必须更换两次(夏季/冬季),因此不太优雅: 但这一切
在我的airflow升级到2.0.0(然后是2.0.1)并且调度程序扩展到3个节点之后,奇怪的事情发生了: DAGRUNN成功,但根本没有计划任务实例 任务失败,主机名为空(https://github.com/apache/airflow/issues/13692) 任务设置为“upstream_failed”,而上游任务成功(https://github.com/apache/airflow/
问题内容: 我知道可以偏斜,但我看不到以特定角度偏斜每个角的方法。 这是我正在从事的项目: 专门查看菜单中的标签。现在,我正在使用图像,我想针对功能强大的浏览器进行更改。 我知道可以创建CSS trapazoid,但是使用没有内容的边框。最终结果还需要一些圆角。 问题答案: 这可能是一个大概的想法: