【问题标题】:PHP Switching Timezones / Retrieving MySQL DataPHP 切换时区/检索 MySQL 数据
【发布时间】:2013-03-21 19:37:40
【问题描述】:

我在我的网站上显示了一个系统状态表,该表在过去 14 天(包括当天)的每一天都有一行。然后对于每一列,我从 MySQL 数据库中选择当天发生的任何事件。

MySQL 中的所有数据都以 UTC 存储,PHP 也在 UTC 下运行。我有两个问题:

  1. 例如,如果用户处于东部时间,则网格会更新以显示明天的日期,即使东部用户只有晚上 8 点。我想我已经通过这样做解决了这个问题:

    while ($i < 14)
        {       
            //SET STATUS DATE
            $status_date = date("Y-m-d H:i:s", strtotime("-$i day"));
    
            //LOCALIZE TIMES    
            $status_date = new DateTime($status_date);
            $status_date->setTimeZone(new DateTimeZone('America/New_York'));
    
            echo $status_date->format("F j, Y");
        }
    
  2. 我遇到的下一个问题是搜索事件。每个事件在数据库中都有一个 INCIDENT_START 字段,我这样查询:

    SELECT INCIDENT_STATUS FROM TABLE_system_status WHERE SYSTEM_AFFECTED='WEBSITE' AND INCIDENT_START BETWEEN '$start_time' AND '$end_time' ORDER BY INCIDENT_START DESC LIMIT 1
    

这是我的问题。如果我使用$start_time = $status_date-&gt;format("Y-m-d 00:00:00")$end_time = $status_date-&gt;format("Y-m-d 23:59:59"),则事件不会显示在表格中的正确日期。

示例: 数据库中的事件的 INCIDENT_START 时间为 2013-03-19 01:02:01 UTC,等于 2013-03-18 21:02:01 EDT。但是,在这种情况下,它仍然显示在我表格的 3 月 19 日列中。

底线....我需要能够在用户本地时间从 00:00:00 到 23:59:59 获取事件,即使它们在数据库中使用 UTC。我有一种感觉,我已经把这复杂化了,但我尝试了很多不同的组合,但似乎无法做到正确。非常感谢任何帮助!

【问题讨论】:

    标签: php mysql date timezone


    【解决方案1】:

    您需要在用户的本地时区设置$status_date并转换为UTC。

    $status_date = new DateTime("today -$i day", new DateTimeZone('America/New_York'));
    $status_date->setTimeZone(new DateTimeZone('UTC'));
    
    $start_time = $status_date->format("Y-m-d H:i:s");
    $status_date->add(new DateInterval('PT23H59M59S'));
    $end_time = $status_date->format("Y-m-d H:i:s");
    

    【讨论】:

    • 感谢您的回复!我试过你的代码,它似乎仍然给了我东部时间的开始/结束。 $status_date-&gt;format("Y-m-d H:i:s T") 的输出产生 2013-03-21 19:09:15 EDT。然后对于 start_time 我得到 2013-03-21 00:00:00 和 end_time 我得到 2013-03-21 23:59:59。我不应该得到 2013-03-21 04:00:00 和 2013-03-22 03:59:59 UTC 等价物吗?
    • 感谢一百万 - 效果很好。如果你有时间,你能解释一下DateInterval('PT23H59M59S') 是如何为我自己的教育做的吗?我做了一些搜索,但找不到任何有用的东西。再次感谢!
    • DateInterval 使用 ISO 8601 持续时间格式。维基百科有解释。 en.wikipedia.org/wiki/ISO_8601#Durations
    • P = "period", T = "Time"(用于分隔时间和日期部分),23H = 23 小时,59M = 59 分钟,59S = 59 秒
    【解决方案2】:

    MySQL 可以为您做到:

    SELECT CONVERT_TZ(INCIDENT_STATUS, 'UTC', 'EST') ...
    

    相关文档:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert-tz

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多