【问题标题】:In MySQL calculating offset for a time zone在 MySQL 中计算时区的偏移量
【发布时间】:2010-10-22 18:37:32
【问题描述】:

MySQL 有没有办法计算任何时区的偏移量? 例如,要获取时区Asia/calcutta 中的当地时间。我想要做的是计算这个时区的偏移量并将该偏移量添加到 GMT 以获得本地时间。

【问题讨论】:

    标签: mysql timezone offset


    【解决方案1】:

    如果要计算时区(例如美国/温哥华)与 UTC 的偏移量,可以按如下方式进行:

    SELECT (unix_timestamp() -  unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600   as offset;
    

    为此,您首先需要将时区信息加载到 mysql 中,如下所述:http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

    【讨论】:

      【解决方案2】:

      SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());

      如果服务器的时区是 PST,这将返回 -8

      SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());

      如果您想将上述结果与 MySQL DateTimes 进行比较,请将其添加到任何 unix 时间戳。

      【讨论】:

        【解决方案3】:
        SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
        

        给予

        +--------+
        | offset |
        +--------+
        |  05:30 |
        +--------+
        

        【讨论】:

        • 通常最好在你的答案中解释代码。讲述它是如何工作的或者你到底在做什么。这有助于新开发人员准确了解正在发生的事情。
        【解决方案4】:

        偏移量将取决于您感兴趣的时间 - 例如,我目前与 UTC 有一个小时的偏移量,但在冬季我的偏移量将为零。

        docs page on MySQL time zone support判断,你想使用convert_tz函数。如果您尝试将 UTC 转换为本地时间,请将“Etc/GMT+0”作为“从”时区,将“Asia/Calcutta”作为“至”。

        【讨论】:

          【解决方案5】:

          我混淆了@ColinM 和@Kenneth Spencer 的答案,因为我想要以小时为单位的任意时区的偏移量:

          TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "UTC", "America/Denver"))
          

          -

          SELECT ROUND(TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", "Asia/Kolkata"))/60,1)
          

          正如 Kenneth 指出的,您需要加载时区信息:http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

          但是你可以做一些有趣的事情,比如一次找到多个时区的偏移量:

          SELECT Name,
          TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", Name)) as Offset
          FROM mysql.time_zone_name 
          WHERE (Name IN ('America/Vancouver', 'Etc/UTC', 'America/Denver'))
          

          给予:

          +-------------------+--------+
          | Name              | Offset |
          +-------------------+--------+
          | America/Denver    |     -6 |
          | America/Vancouver |     -7 |
          | Etc/UTC           |      0 |
          +-------------------+--------+
          

          【讨论】:

            【解决方案6】:

            我想知道@ColinM 上面的回答是否安全。它会读一次或两次时钟吗? UTC_TIMESTAMP() 和 NOW() 是否有可能相隔一秒?我不知道,但这可以避免这种情况。

            SET @now = now();
            SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
            SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);
            

            【讨论】:

            • 这是一半问题一半答案
            【解决方案7】:
            DATEDIFF(NOW(), UTC_TIMESTAMP())
            

            【讨论】:

              【解决方案8】:
              SET time_zone = '-07:00';
              

              你可以只传入一个偏移量

              http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

              【讨论】:

              • 永远不要使用偏移量来设置时区!始终使用名称,例如“欧洲/布拉格”。否则当 DST 发生时你会感到非常惊讶。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-08-05
              • 1970-01-01
              • 1970-01-01
              • 2018-03-25
              • 1970-01-01
              • 2018-04-13
              • 1970-01-01
              相关资源
              最近更新 更多