mysql 设置 utc_关于时间:MySQL应该将其时区设置为UTC吗?

  • Post author:
  • Post category:mysql

跟随问题HTTPS://serverfault.com/questions/191331/should-servers-have-their-timezone-set-to-GMT-UTC

应将神秘的时间带设置到UTC,还是应设置为服务器或PHP的同一时间带?如果不是UTC

职业与愚蠢是什么?

stackoverflow.com/a/1650406/175071分享使用UTC的充分理由

UTC不是时区。UTC是标准,GMT是时区。zachholman.com/talk/utc-is-enough-for-everyone-right

只要您为当前时区设置了正确的时间,知道存储的日期时间列的时区,并且知道夏令时的问题,那么服务器上的时区似乎就无关紧要了。好的。

另一方面,如果您控制了与您一起工作的服务器的时区,那么您可以在内部将所有内容设置为UTC,而不必担心时区和DST。好的。

以下是我收集到的一些关于如何使用时区的笔记,这些笔记是我自己和其他人的一种欺骗形式,这些笔记可能会影响此人将为其服务器选择什么时区,以及他/她将如何存储日期和时间。好的。MySQL时区作弊表

笔记:好的。

更改时区不会更改存储的日期时间或时间戳,但它将从中选择不同的日期时间时间戳列

警告!UTC有闰秒,看起来像”2012-06-30 23:59:60″,可以随机添加,提前6个月通知,因地球自转

格林尼治标准时间混淆了秒数,这就是为什么发明了UTC。好的。

警告!不同的区域时区可能会产生相同的到期日期时间值到夏令时好的。

时间戳列仅支持日期1970-01-01 00:00:01到2038-01-19 03:14:07 UTC,因为存在限制。

在内部,mysql timestamp列存储为utc,但选择日期时,MySQL会自动将其转换为当前会话时区。好的。

当在时间戳中存储日期时,MySQL将假定位于当前会话时区,并将其转换为储存。好的。

MySQL可以将部分日期存储在datetime列中,这些列看起来像”2013-00-00 04:00:00″

如果将日期时间列设置为空,除非在创建它。

读这个

以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`

号要以UTC格式选择当前日期时间:

示例结果:2015-03-24 17:02:41好的。选择会话时区中的当前日期时间

。选择服务器启动时设置的时区

SELECT @@system_time_zone;

返回莫斯科时间的”msk”或”+04:00″,例如,有(或曾经)一个MySQL错误,如果设置为数字偏移,它将不会调整夏令时。好的。获取当前时区

如果您的时区是+2:00,它将返回02:00:00。好的。要获取当前的Unix时间戳(秒):

获取时间戳列作为UNIX时间戳

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

号获取作为UNIX时间戳的UTC日期时间列

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, ‘+00:00’, @@session.time_zone)) FROM `table_name`

从正的unix时间戳整数获取当前时区日期时间

SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`

。从UNIX时间戳获取UTC日期时间

SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, ‘+00:00’)

FROM `table_name`

从负的unix时间戳整数获取当前时区日期时间

SELECT DATE_ADD(‘1970-01-01 00:00:00’,INTERVAL -957632400 SECOND)

。在mysql中有3个地方可以设置时区:

注:时区可以设置为两种格式:好的。

与UTC的偏移量:”+00:00″、”+10:00″或”-6:00″

作为命名时区:”欧洲/赫尔辛基”、”美国/东方”或”大都会”

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”文件中

default_time_zone=’+00:00′

或好的。

timezone=’UTC’

@@global.time_区域变量

查看它们设置为什么值好的。

SELECT @@global.time_zone;

要为其设置值,请使用以下任一项:好的。

SET GLOBAL time_zone = ‘+8:00’;

SET GLOBAL time_zone = ‘Europe/Helsinki’;

SET @@global.time_zone=’+00:00′;

@@session.time_区域变量

SELECT @@session.time_zone;

要设置它,请使用以下任一项:好的。

SET time_zone = ‘Europe/Helsinki’;

SET time_zone =”+00:00″;

SET @@session.time_zone =”+00:00″;

“@@global.timeu zone variable”和”@@session.timeu zone variable”都可能返回”system”,这意味着它们使用”my.cnf”中设置的时区。好的。

要使时区名称正常工作(即使对于默认时区),必须设置需要填充的时区信息表:http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html好的。

注意:您不能这样做,因为它将返回空值:好的。

SELECT

CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), ‘+00:00’) AS `utc_datetime`

FROM `table_name`

号设置MySQL时区表

要使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行的列’abbreviation’太长”,则可能是由于在时区缩写的末尾附加了一个空字符所致。好的。

解决方法是运行这个好的。

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 2011https://chrisjean.com/updating-daylight-saving-time-on-linux/)好的。查看每个时区的完整DST(夏令时)转换历史记录

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更改。好的。

注:根据文档,您为时区设置的值不会更改,例如,如果您将其设置为”+01:00″,则该时区将设置为与UTC的偏移量,该偏移量不遵循DST,因此它将全年保持不变。好的。

只有指定的时区才会在夏令时更改时间。好的。

像CET这样的缩写词总是冬季,CEST是夏季,而+01:00总是UTC时间+1小时,两者都不会随着dst而改变。好的。

system时区将是安装mysql的主机的时区(除非mysql无法确定)。好的。

您可以在这里阅读有关使用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网站

好啊。

所以如果我的列类型设置为timestamp。我的时区是+12:00,我想使用基于UTC的日期/时间更新一列,是否有任何方法可以在更新语句中包含时区,或者我应该使用convert-tz。例如:update tableset modified=’2016-07-07 08:10+00:00′

@BumperBox MySQL总是假设您给出时间戳列的日期与MySQL服务器处于同一时区,因此需要将您的日期从+12:00时区转换为MySQL服务器时区进行更新。这就是为什么我在MySQL服务器上使用UTC,并在存储之前将任何日期转换为UTC。

这是我多年来所遇到的最好、最有用的答案之一。谢谢您。

警告!!!!夏令时结束时,DST时区中本地时间的任何使用或转换都将在每年一小时内以一小时为单位出错。这会影响到UNIX_TIMESTAMP(NOW());以及CONVERT_TZ()的所有使用,其中一个参数是”@@session.time”zone。为了可靠地将UTC日期时间转换为UNIX时间戳,您基本上必须首先设置会话时区。

@完全正确,我之前忘了修。

这是一个工作示例:

jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Europe/Moscow

php和mysql有自己的默认时区配置。您应该在数据库和Web应用程序之间同步时间,否则可能会出现一些问题。

阅读本教程:如何同步php和mysql时区

基本上有两行代码:date_default_timezone_set(“America/Los_Angeles”);和mysql_query(“SET time_zone='” . date(‘P’, time()) .”‘”);工作得非常优雅!

@本体小心!今天早上我一直在挠头,因为这正是我所做的,我的一些时间现在已经一个小时了。我怀疑,当涉及DST时,使用命名时区更准确。如果您使用美国/纽约,MySQL知道DST,并会适当地存储日期。如果您像这里一样将其设置为-04:00,则不会考虑DST计算。

一定要检查MySQL是否正确了解DST,DST规则是否定期更新,相关的MySQL表是否也需要更新(见上面我答案的底部)

正反两面差不多,这取决于你是否想要。

注意,如果mysql时区与系统时间(例如php)不同,将时间或打印时间与用户进行比较将涉及一些修补。


版权声明:本文为weixin_27787297原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。