Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL应该将其时区设置为UTC吗?_Mysql_Time_Utc - Fatal编程技术网

MySQL应该将其时区设置为UTC吗?

MySQL应该将其时区设置为UTC吗?,mysql,time,utc,Mysql,Time,Utc,人权的后续问题 MySQL时区应该设置为UTC还是应该设置为与服务器或PHP设置相同的时区?(如果不是UTC) 利与弊是什么?利与弊几乎相同。这取决于你是否想要这个 请小心,如果MySQL时区与您的系统时间(例如PHP)不同,则将时间或打印内容与用户进行比较需要进行一些修改。PHP和MySQL有自己的默认时区配置。您应该同步数据库和web应用程序之间的时间,否则可能会出现一些问题 阅读本教程:服务器上的时区似乎无关紧要,只要您为当前时区设置了正确的时间,知道存储的日期时间列的时区,并且知道夏令

人权的后续问题

MySQL时区应该设置为UTC还是应该设置为与服务器或PHP设置相同的时区?(如果不是UTC)


利与弊是什么?

利与弊几乎相同。这取决于你是否想要这个


请小心,如果MySQL时区与您的系统时间(例如PHP)不同,则将时间或打印内容与用户进行比较需要进行一些修改。

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


阅读本教程:

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

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

以下是我收集的一些关于如何使用时区的笔记,作为我自己和其他人的备忘单,这些备忘可能会影响此人为其服务器选择的时区以及他/她将如何存储日期和时间

MySQL时区备忘单 注:

  • 更改时区不会更改存储的日期或时间 时间戳,但它将从中选择不同的日期时间 时间戳列
  • 警告UTC有闰秒,看起来像“2012-06-30 23:59:60”,可以 随机添加,提前6个月通知,因为 地球自转
  • GMT混淆了秒,这就是UTC被发明的原因

  • 警告不同的区域时区可能会产生相同的datetime值 夏时制

  • 时间戳列仅支持日期1970-01-01 00:00:01至2038-01-19 03:14:07 UTC,原因是
  • 在内部,存储为but 选择日期时,MySQL将自动将其转换为 当前会话时区

    当在时间戳中存储日期时,MySQL将假定日期 在当前会话时区中,并将其转换为UTC以用于 储藏室

  • MySQL可以在datetime列中存储部分日期,如下所示 “2013-00-00 04:00:00”
  • 如果将datetime列设置为 NULL,除非您在指定时特别将列设置为允许NULL 创造它
  • 选择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-2417:02:41

    在会话时区中选择当前日期时间 选择服务器启动时设置的时区 返回莫斯科时间的“MSK”或“+04:00”。例如,存在(或曾经存在)一个MySQL错误,如果设置为数字偏移,则不会调整夏令时

    获取当前时区的步骤 如果您的时区为+2:00,它将返回02:00:00

    要获取当前UNIX时间戳(以秒为单位): 以UNIX时间戳的形式获取时间戳列 获取UTC日期时间列作为UNIX时间戳的步骤 从正UNIX时间戳整数获取当前时区datetime 从UNIX时间戳获取UTC日期时间 从负UNIX时间戳整数获取当前时区datetime MySQL中有3个地方可以设置时区: 注:时区可设置为两种格式:

  • UTC的偏移量:“+00:00”、“+10:00”或“-6:00”
  • 作为命名时区:“欧洲/赫尔辛基”、“美国/东部”或“大都会”
  • 仅当时区信息表 在mysql数据库中,已创建并填充

    在文件“my.cnf”中 或

    @@全局时区变量 查看它们设置为什么值

    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'));