2

これが不明確な場合はご容赦ください。しかし、頭の中にあることを紙に書き留めるのに苦労しています。

シナリオ:

さまざまなジョブをテーブルに格納します。これらはすべて、UTC タイム ゾーンに設定された DATETIME を使用してタイムスタンプが付けられます。

システム時間をユーザーの現地時間に転記できるように、ユーザーはプリファレンスでタイムゾーンを設定している場合があります。

ここで、ユーザーが 2012 年 10 月 25 日 (ローカル ユーザー時間) に入力されたすべてのジョブを選択するとします。

+--------------------------------------+------------+---------+---------------------+
| id                                   | project_id | amount  | created             |
+--------------------------------------+------------+---------+---------------------+
| 50889ba5-77b4-41e1-a942-1dea0ab761f6 |   15076850 |   50.00 | 2012-10-25 01:53:41 |
| 5088b9a3-8110-446e-81c8-75da341f3f95 |   15076850 | 2000.00 | 2012-10-25 04:01:39 |
| 5088c852-d434-41e6-ba5d-27560ab761f6 |   15076850 |  100.00 | 2012-10-25 05:04:18 |
| 50892a3b-ad9c-4a32-aebf-384c0ab761f6 |   15076850 |  500.00 | 2012-10-25 12:02:03 |
| 50893098-6b9c-4028-9a87-3eb20ab761f6 |   15076850 |   25.00 | 2012-10-25 12:29:12 |
| 50894b10-d260-4f61-8eb9-1d190ab761f6 |   15076850 |   25.00 | 2012-10-25 14:22:08 |
| 50895129-48c8-4bb4-928f-483b341f3f95 |   15076850 |   25.00 | 2012-10-25 14:48:09 |
| 50896019-7144-4e74-8037-4160341f3f95 |   15076850 |   50.00 | 2012-10-25 15:51:53 |
+--------------------------------------+------------+---------+---------------------+
8 rows in set (0.00 sec)

このユーザーが米国東部 (EST) にいて、この表の時刻が UTC である場合、表の最初の 2 行の結果は 10 月 24 日となります。基本的に、ユーザーが EST の場合、最初の 2 行を除外します。

私は の使用を実験してきましたがDateTime()、これは DST の終わり (2012 年 11 月 4 日) にまたがるため、行き詰まっています。10 月 25 日の日付を選択すると、DST がアクティブになるため、ユーザーの現地時間が UTC -0400 として表示されます。ジョブが終了すると、(UTC -0500) 以降になります。

私はこれを機能させる方法に完全に行き詰まっています。

4

1 に答える 1

3

ユーザーの真夜中 (以下の例では UTC 午前 4 時) の UTC タイムスタンプを取得します。

$start = new DateTime('2012-10-25 00:00:00', new DateTimeZone('America/New_York'));
$start->setTimeZone(new DateTimeZone('UTC'));
$start = $start->format('Y-m-d H:i:s');

// do the same with $end

SELECT ... WHERE `created` BETWEEN $start AND $end

最後のクエリWHERE BETWEEN 2012-10-25 04:00:00 AND 2012-10-26 03:59:59では、America/New York の 10 月 25 日を選択する必要があります。

これは、DST の変更中にも機能するはずです。11 月 4 日のクエリは になりBETWEEN 2012-11-04 04:00:00 AND 2012-11-05 04:59:59、さらに 1 時間かかります。

于 2012-12-12T07:36:02.200 に答える