0

我在我的站点上显示了一个系统状态表,该表在过去 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->format("Y-m-d 00:00:00")and $end_time = $status_date->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。我有一种感觉,我把这复杂化了,但我尝试了很多不同的组合,但似乎无法做到正确。非常感谢任何帮助!

4

2 回答 2

0

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

于 2013-03-21T19:51:56.873 回答
0

您需要$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");
于 2013-03-21T21:32:10.200 回答