0

過去 14 日間 (日を含む) ごとに 1 行のシステム ステータス テーブルをサイトに表示しています。次に、列ごとに、その日に発生したイベントを MySQL データベースから選択します。

MySQL のすべてのデータは UTC で保存され、PHP も UTC で動作します。私は2つの問題を抱えています:

  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")$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 日の列にはまだ表示されています。

要するに....データベースではUTCであっても、ユーザーの現地時間で00:00:00から23:59:59までのイベントを取得できる必要があります。これを複雑にしすぎているような気がしますが、さまざまな組み合わせを試してみましたが、うまくいかないようです。どんな助けにも本当に感謝します!

4

2 に答える 2

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 に答える
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 に答える