Should MySQL have its timezone set to UTC?
跟随问题HTTPS://serverfault.com/questions/191331/should-servers-have-their-timezone-set-to-GMT-UTC
应将神秘的时间带设置到UTC,还是应设置为服务器或PHP的同一时间带?如果不是UTC
职业与愚蠢是什么?
只要您为当前时区设置了正确的时间,知道存储的日期时间列的时区,并且知道夏令时的问题,那么服务器上的时区似乎就无关紧要了。好的。
另一方面,如果您控制了与您一起工作的服务器的时区,那么您可以在内部将所有内容设置为UTC,而不必担心时区和DST。好的。
以下是我收集到的一些关于如何使用时区的笔记,这些笔记是我自己和其他人的一种欺骗形式,这些笔记可能会影响此人将为其服务器选择什么时区,以及他/她将如何存储日期和时间。好的。MySQL时区作弊表
笔记:好的。
格林尼治标准时间混淆了秒数,这就是为什么发明了UTC。好的。
警告!不同的区域时区可能会产生相同的到期日期时间值到夏令时好的。
在内部,mysql timestamp列存储为utc,但选择日期时,MySQL会自动将其转换为当前会话时区。好的。
当在时间戳中存储日期时,MySQL将假定位于当前会话时区,并将其转换为储存。好的。
以UTC格式选择时间戳列
无论当前MySQL会话处于哪个时区:好的。
1 2 3 | SELECT CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime` FROM `table_name` |
您还可以将服务器、全局或当前会话时区设置为UTC,然后选择时间戳,如下所示:好的。
号要以UTC格式选择当前日期时间:
1 2 3 | SELECT UTC_TIMESTAMP(); SELECT UTC_TIMESTAMP; SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00'); |
示例结果:
1 2 3 |
。选择服务器启动时设置的时区
1 | SELECT @@system_time_zone; |
返回莫斯科时间的"msk"或"+04:00",例如,有(或曾经)一个MySQL错误,如果设置为数字偏移,它将不会调整夏令时。好的。获取当前时区
1 |
。
如果您的时区是+2:00,它将返回02:00:00。好的。要获取当前的Unix时间戳(秒):
1 2 |
获取时间戳列作为UNIX时间戳
1 |
号获取作为UNIX时间戳的UTC日期时间列
1 |
从正的unix时间戳整数获取当前时区日期时间
1 |
。从UNIX时间戳获取UTC日期时间
1 2 | SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00') FROM `table_name` |
从负的unix时间戳整数获取当前时区日期时间
。在mysql中有3个地方可以设置时区:
注:时区可以设置为两种格式:好的。
Named time zones can be used only if the time zone information tables
in the mysql database have been created and populated.Ok.
号在"my.cnf"文件中
1 | default_time_zone='+00:00' |
。
或好的。
1 | timezone='UTC' |
@@global.time_区域变量
查看它们设置为什么值好的。
。
要为其设置值,请使用以下任一项:好的。
1 2 3 |
@@session.time_区域变量
。
要设置它,请使用以下任一项:好的。
号
"@@global.timeu zone variable"和"@@session.timeu zone variable"都可能返回"system",这意味着它们使用"my.cnf"中设置的时区。好的。
要使时区名称正常工作(即使对于默认时区),必须设置需要填充的时区信息表:http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html好的。
注意:您不能这样做,因为它将返回空值:好的。
1 2 3 | SELECT CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime` FROM `table_name` |
号设置MySQL时区表
要使
1 2 3 4 5 |
号
如果它们是空的,则通过运行此命令来填充它们好的。
1 | mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql |
号
如果此命令给出错误"数据对于第1行的列'abbreviation'太长",则可能是由于在时区缩写的末尾附加了一个空字符所致。好的。
解决方法是运行这个好的。
1 2 3 4 5 6 7 8 | 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规则是最新的
1 2 3 4 5 6 7 8 9 10 11 | 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 |
号
注:根据文档,您为时区设置的值不会更改,例如,如果您将其设置为"+01:00",则该时区将设置为与UTC的偏移量,该偏移量不遵循DST,因此它将全年保持不变。好的。
只有指定的时区才会在夏令时更改时间。好的。
像
您可以在这里阅读有关使用DST的更多信息好的。
相关问题:好的。
- 如何设置MySQL的时区?
- mysql-选择UTC格式的时间戳列
- 如何从UTC时间获取MySQL中的Unix时间戳?
- 将服务器mysql时间戳转换为UTC
- https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
- 如何获取MySQL的当前时区?
- mysql日期时间字段和夏令时——如何引用"额外"小时?
- 从unixtime转换负值
资料来源:好的。
- https://bugs.mysql.com/bug.php?内径=68861
- http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
- http://dev.mysql.com/doc/refman/5.1/en/datetime.html
- http://en.wikipedia.org/wiki/coordinatedu环球时间
- http://shafiqissani.wordpress.com/2010/09/30/how-to-get-the-current-epoch-time-unix-timestamp/
- https://web.ivy.net/~carton/rant/mysql-timezones.txt网站
好啊。
这是一个工作示例:
1 | jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Europe/Moscow |
php和mysql有自己的默认时区配置。您应该在数据库和Web应用程序之间同步时间,否则可能会出现一些问题。
阅读本教程:如何同步php和mysql时区
正反两面差不多,这取决于你是否想要。
注意,如果mysql时区与系统时间(例如php)不同,将时间或打印时间与用户进行比较将涉及一些修补。