10

ユーザーとは異なるタイムゾーンに対処しなければならない Web サイトを開発しています。ウェブサイトはオークションのような時間に敏感なイベントを主催しているため、これは大きな問題になります.

サーバー上のすべての日付/時刻は UTC です。データベースはすべてを UTC タイムスタンプで保存します。PHP のデフォルトのタイムゾーンも UTC に設定されています ( date_default_timezone_set('UTC');)。

さて、私の問題は、日付のみを表示するか、さらに重要なことに、ユーザー入力から日付/時刻を読み取るかどうかにかかわらず、ユーザーと対話する方法です。

具体例:

  • オークションには締め切りがあり、UTC としてデータベースに保存します。
  • Web サイトでオークションを表示すると、JavaScript タイマーがDateオブジェクトを使用して残り時間を計算します。タイムゾーンを自動的に GMT+0100 (私のローカル タイムゾーン) に変換します。したがって、締め切りが'2013-08-08 10:46:08'(UTC) の場合、JavaScript の日付オブジェクトは を返しAug 08 2013 11:26:15 GMT+0100 (GMT Standard Time)ます。
  • 現在の時刻が 11:46:08 より大きい場合、タイマーは残り時間が 00:00 であることを示します (これは正しいです)。
  • しかし、入札を挿入しようとすると、の条件が次のようにMySQL INSERT評価されるため、サーバーは受け入れtrueます。

    入札に挿入 ... WHERE ... AND オークション期限 > NOW() ...

( なぜなら、uction_deadline ='2013-08-08 10:46:08'と NOW() = '2013-08-08 10:26:50')

タイムゾーンのこの巨大なジャンボはすべて、私の脳を溶かします。ここで何が欠けていますか?データベース内にすべての日付/時刻を UTC で保存するのが最善であることはほぼ確実です。ユーザーとデータベースの間でそれをどのように処理するのか、はっきりとはわかりません。

4

6 に答える 6

1

あなたが言った

( なぜなら、uction_deadline = '2013-08-08 10:46:08' および NOW() = '2013-08-08 10:26:50')

In MySQL -NOWサーバーのローカル タイム ゾーン(ドキュメント)で現在の時刻を返します。

おそらく、現在の時刻を UTC (docs)UTC_TIMESTAMPで返すようなものが必要です。

また、おそらくクライアント JavaScript からの入力時間をまったく受け入れるべきではありません。自分の時計だけを信頼してください。入札が行われると、MySQL または PHP でサーバーの時間を使用します。入力として受け入れないでください。

于 2013-08-08T14:18:21.383 に答える
0

次のことができます

ページが読み込まれたら、ユーザーのタイムゾーン オフセットを使用して ajax リクエストをサーバーに送信します。次のコードを使用して、タイムゾーン オフセットを取得できます。

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

offset は分単位のタイムゾーン オフセットです。

役立つと思います。

于 2013-08-08T11:11:18.337 に答える