【问题标题】:PHP/MySQL timestamp and timezonesPHP/MySQL 时间戳和时区
【发布时间】:2011-06-02 04:47:54
【问题描述】:

如果我使用 MySQL 中的 NOW() 函数获取当前时间戳,我可以通过 php 获取该字段并在不同时区给出该时间吗?基本上将当前时区的当前时间转换为另一个时区?

【问题讨论】:

    标签: php mysql timezone timestamp


    【解决方案1】:

    MySQL 的时区处理比 PHP 的要复杂得多。它处理简单的时区(EST、PST 等)以及我称之为“区域时区”(美国/东部)的内容。即使 DST 规则多年来发生变化,使用区域区域也会使用正确的转换,包括夏令时。

    我所做的是使用 MySQL 函数 UTC_TIMESTAMP() 将我所有的日期时间存储为 UTC。然后,在查询中,我使用 MySQL 函数 CONVERT_TZ() 到我的目标时区。 http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

    注意:您可能需要更新您的时区表。 http://dev.mysql.com/downloads/timezones.html

    【讨论】:

    • 从 PHP 5 开始,PHP 是两者中更复杂的一个:DateTime 类完全支持时区。 DateTime 时间戳可以设置并交叉转换到任何区域。 MySQL 根本无法在 DATETIME 字段中存储时区信息。尽管如此,CONVERT_TZ 当然是一种有效的方法
    • 不一定有效。阅读 Aarons 对此问题的回复stackoverflow.com/questions/1646171/…
    【解决方案2】:

    您可以使用DateTimeZone 类:

    $gmt = new DateTimeZone("GMT");
    $datetimeInGMT = new DateTime($now, $gmt);
    

    它还采用continent/city 形式的位置,例如Europe/London.

    如果您的日期时间不是 UTC,您可以使用 setTimezone:

    $datetimeInGMT = new DateTime($now, new DateTimeZone("America/New_York"));
    $datetimeInGMT->setTimezone(new DateTimeZone("GMT"));
    

    【讨论】:

    • 对,但是如果我已经在不同的时区拥有时间戳怎么办?我可以将其转换为不同的时区吗?
    • +1(如果可以的话,DateTime 的另一个 +1)但不要忘记,要使其正常工作,您需要知道 mySQL 服务器的当前时区才能获取开始日期正确的! MySQL 的时区设置可能与系统的时区不同。
    • @Pekka 你可以通过SELECT @@session.time_zone;得到它
    • 另外,如果您不想使用 DateTime 类(没有理由不这样做,只是说)并且您有一个有效的时间戳或日期(例如 2011 年 1 月 1 日下午 5:00,或 2011-01-01 20:00:00),您可以执行类似 date("whatever format",strtotime($timestamp) + $theoffset * 3600) 的操作,其中 $timestamp 是日期,$theoffset 是 $timestamp 的时区与您希望将其更改为的时区之间的差异以小时为单位。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2010-12-11
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多