0

複数の場所に複数のサーバーがあり、フィールドの日付に MySQL の日時型を使用したいとします。また、フィールドの日付に常に UTC タイムスタンプを持たせたいのでUTC_TIMESTAMP()、データベースに追加するときに a を実行します。ここで、MySQL に UNIX TIMESTAMP を出力させたいとします。

サーバー AI でこれを行うと、「2009-06-17 12:00:00」という文字列が取得され、UNIX_TIMESTAMP(STRING) を実行すると、1245240000 という数値が返されます。これは、UTC 時間で 2009-06-17 12:00:00 です。サーバー B で同じことを行います。UTC 文字列であるため、同じ文字列が返されますが、UNIX_TIMESTAMP(STRING) を再度実行すると、UTC +2 時間である間違った番号 1245232800 が返されます。どうすればこれを回避できますか? PHP側で文字列からタイムスタンプへの変換を行う必要がありますか?

4

2 に答える 2

1

こんばんは

当然のことですが、両方のマシンで日付と時刻を確認しましたか?

編集: ...そして、MySQL タイムゾーンは両方のマシンで同じでしたか?

更新:わかりました。問題は、UNIX_TIMESTAMP に渡されるタイムスタンプ文字列が現在のタイムゾーンの値であると解釈され、UTC に変換されるという事実にあります。MEZ にいるため、UTC に戻すために 2 時間が減算されます。そのため、タイムスタンプが Unix タイムストリングに変換されるときに、タイムスタンプから 7200 が差し引かれます。

したがって、UNIX_TIMESTAMP() を使用して変換するときに表示されるバリエーションは、Unix Epoch タイムストリングに戻ります。

ところで、DATETIME タイプの代わりに、UTC_TIMESTAMP を保存するために TIMESTAMP タイプを使用すべきではありませんか?

更新:格納された時間からプレゼンテーション時間を分離することは、間違いなく進むべき道です。その後、世界中で同じデータを再利用でき、データをユーザーに提示するときに現地時間との間で変換するだけで済みます。

これを行わないと、タイムスタンプが作成されたときにタイムゾーンを保存する必要があり、次の場合に解決しなければならないあらゆる種類の複雑な順列に入る必要があります。

  • ローカル タイムゾーンが保存されたときは夏時間でした。
  • データが保存された時点のタイムゾーンと、データが表示されるタイムゾーンの違いは何ですか。

すべてを UTC として保存しておくと、それがなくなります。

ほとんどのユーザーは、返された UTC 時間に基づいてローカル時間を自分で計算しなければならない場合、それほど満足しません。そのため、システムは通常、ユーザーの現在のローカル時間に変換します。

これはもちろん、ユーザーがデータを現地時間で表現したい場合であり、通常はそうです。私が考えることができる唯一の広く使用されているシステムで、そのデータを UTC で保存して表示するシステムは、常に UTC (より正確には ZULU 時間) に保持される航空管制とフライト プラン管理のシステムです。 .

HTH

乾杯、

于 2009-06-19T13:31:27.700 に答える
0

これを試してみましたか?

この命令を一緒に実行してください。

SET time_zone = 'UTC';
SELECT FROM_UNIXTIME(0), UNIX_TIMESTAMP('2009-06-17 12:00:00'); 
// 1970-01-01 00:00:00        1245240000

これらはクライアント セッションにのみ影響し、サーバー構成には影響しません。

于 2009-06-19T14:29:34.447 に答える