我在我的站点上显示一个系统状态表,其中有过去14天(包括天)中的每一行。然后,对于每一列,我从MySQL数据库中选择当天发生的任何事件。
MySQL中的所有数据都是用UTC存储的,PHP也在UTC下运行。我有两个问题:
-
例如,如果用户在东部时间,网格正在更新以显示明天的日期,即使东部用户只有晚上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"); }
-
我的下一个问题是对事件的搜索。每个事件在数据库中都有一个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")
和$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。我有一种感觉,我把这个弄得太复杂了,但我试过很多不同的组合,似乎都做不好。非常感谢任何帮助!
需要将$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");
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