【问题标题】:Mysql FROM_UNIXTIME as UTCMysql FROM_UNIXTIME 为 UTC
【发布时间】:2013-08-19 01:32:05
【问题描述】:

如何获得

FROM_UNIXTIME

在 mysql 中作为 UTC/GMT?日期以连接的时区返回。

我不想更改连接的时区。

【问题讨论】:

    标签: mysql timezone


    【解决方案1】:

    你最好提前设置时区:

    SET time_zone='UTC';
    select FROM_UNIXTIME(1277942400);
    

    原因是涉及本地时区的转换可能是有损的。在docs here 中有一个例子(参见UNIX_TIMESTAMP() 部分下的第4 段,以“注意:”开头)

    【讨论】:

    • SET time_zone = '+00:00' 为我工作。如果您希望保留它,请参阅 Mārtiņš Radiņš 答案。
    • 哦,可爱,所以要查看特定时区的时间戳:SET time_zone='America/Los_Angeles';SELECT FROM_UNIXTIME(inserted_at) FROM activity;
    • 请注意,这不符合 OP 的要求“我不想更改连接的时区。”
    • 同意。 Wutzebaer's answer 比我的好多了。它应该被标记为接受的答案。
    【解决方案2】:

    我的解决方案是

    SELECT CONVERT_TZ(FROM_UNIXTIME(1277942400), @@session.time_zone,'UTC')
    

    如果CONVERT_TZ返回null,请确保mysql的时区表被填满:

    zypper install mysql-community-server-tools
    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
    

    【讨论】:

    • 我喜欢解决方案的无国籍状态
    • 多么棒的解决方案 :)
    • 它是无状态的,但由于日期不明确而失败,因为 conver_ttz 无法知道源时间戳的时区偏移量。
    • @MarcLehmann 所说的是正确的,但请注意,在使用 DST 的时区中,歧义每年仅持续一小时。这可能是一个问题,也可能不是,这取决于您的业务。
    • 如果它不返回 null 会很棒
    【解决方案3】:

    我知道这个问题已经得到解答,但我仍然想贡献:

    如果您不希望您的服务器使用 NOW()FROM_UNIXTIME() 等函数生成 UTC 时区时间,则必须像 @Matt Johnson 所说的那样设置 time_zone

    有一件事他没有提到:SET time_zone = timezone; 仅为当前连接设置时区。 如果您希望这些函数默认返回/转换您的 UTC 日期,请使用 SET GLOBAL time_zone = '+00:00',这样您就不必每次想要保存一些基于 UTC 的日期时都设置时区。

    检查您当前的时区设置:SELECT @@global.time_zone, @@session.time_zone;

    MySQL :: MySQL 5.5 Reference Manual :: 10.6 MySQL Server Time Zone Support

    【讨论】:

      【解决方案4】:

      如果你像我一样懒惰并且不想更改全局会话时区变量(移动到另一台服务器,忘记在那里更改并跳转,你有麻烦了),会话变量(使用了一些模块自动重新连接到 db 和跳,您在连接时发出的变量已经消失)并且不希望加载时区的东西,那么我想这可能会有所帮助:)。

      select 
        now() as timezoned,
        date_add(
          FROM_UNIXTIME(0), interval 
            unix_timestamp()+TIMESTAMPDIFF(SECOND,NOW(),UTC_TIMESTAMP()) SECOND
        ) as utc
      

      即使使用负时间戳,它也能正常工作。如果您需要转换特定列,只需将 unix_timestamp() 替换为包含时间戳的列。

      作为奖励,如果您需要找到 datetime 和 now 之间的差异,而该列位于 unix_timestamp(例如“utc”)中,只需将其包装为 TIMESTAMPdiff(SECOND, .., NOW()) 和节省了一天:)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多