3

私のDBサーバー(MySql 5.5を実行)はUTCに設定されており、日付はUNSIGNED INTを使用してデータベースにUnixタイムスタンプとして保存されます。データベースは主に、特定の時間 (exec_time) に実行されるタスクを格納するために使用されます。

ログインしたユーザーのタイムゾーン (この例では BST) を使用して、PHP でタイムスタンプを作成することにより、タスクを挿入します。たとえば、明日の午前 4 時 GMT の 1351396800 で実行するように設定されたタスクがあります。

次のクエリを使用して、データベースからタスクを抽出します。

SELECT * FROM tasks WHERE exec_time <= UNIX_TIMESTAMP();

明日の午前 2 時に時計が 1 時間巻き戻されたら、この設定は問題ありませんか?

更新: PHP は日付を正常に変換しています。PHP タイムゾーンをヨーロッパ/ダブリン (現在は BST) に設定すると、深夜 12 時と午前 4 時に追加された 2 つのイベントが次のように保存されます。

mysql> select exec_time, FROM_UNIXTIME(exec_time) from tasks order by id desc limit 2;
+-------------+----------------------------+
| exec_time | FROM_UNIXTIME(exec_time) |
+-------------+----------------------------+
|  1351378800 | 2012-10-27 23:00:00        |
|  1351396800 | 2012-10-28 04:00:00        |
4

2 に答える 2

1

exec_timetl;dr列に TIMESTAMP データ型が含まれている限り問題ありません。

明示的な UNIX_TIMESTAMP 列のデータ型はありません。TIMESTAMP 列のデータ型があります。このデータ型の列の値は、日付/時刻文字列および UTC から変換されるときに、クライアント接続のタイム ゾーンから UTC (別名 Z またはズールー時間、f/k/グリニッジ標準時) に自動的に変換されます。日付/時刻文字列に変換すると、クライアント接続のタイム ゾーンに変換されます。

したがって、exec_time列を として保存しているTIMESTAMP場合は、提案する句を使用できるはずです。

  WHERE exec_time <= UNIX_TIMESTAMP()

サーバー側ではexec_time、値と関数呼び出しの結果の両方が UTC で処理されるため、これは機能します。UNIX_TIMESTAMP()値はUTCexec_timeで保存されます。

exec_timeまたは同様の数値データ型として格納する場合UNSIGNED INT、格納する前に UTC への自動変換を利用できません。

クライアント接続の time_zone を次のように設定すると、ディスプレイの変換動作を台無しにすることができます。

  SET time_zone='SYSTEM'   /* for your system's local time */

また

  SET time_zone='+0:00'   /* for UTC */

また

  SET time_zone'America/New_York' /* or 'Europe/Vienna' or whatever */

これらの SET 操作のいずれかを発行したら、次の操作を行います。

 SELECT exec_time, FROM_UNIXTIME(exec_time) 

値がサーバー側でどのように保存され、変換されるかを理解するために。

8 日後に何が起こるかを確認したい場合は、次のようにしてください。

 SELECT 3600*24*8+exec_time, FROM_UNIXTIME(3600*24*8+exec_time) 

http://dev.mysql.com/doc/refman/5.5/en//time-zone-support.html

于 2012-10-27T21:03:41.047 に答える
0

あなたの質問への回答として、時間フィールドがどれほど重要であるか、およびサーバーの現地時間が変更されるかどうかによって異なります。UTC の場合は、おそらく変更されません。

MySQL の時間型はタイムゾーンに対応していません。おそらく、UTC タイムスタンプ/日付時刻と、タイムゾーンの UTC タイムスタンプに加算または減算する時間を +12 から -12 時間までの間隔オフセットを含む別のタイムゾーン列を常に格納することにより、タイムゾーンを自分で実装する必要があります。 .

残念ながら、タイムゾーン フィールドに入力する値の実際の処理と、タイムゾーンに合わせて調整されたタイムスタンプを取得するために必要な作業は、ユーザー次第です。

Postgres に切り替えるオプションがある場合は、Postgres が提供する TIMESTAMP WITH TIMEZONE タイプをいつでも使用できます。

于 2012-10-27T20:28:19.337 に答える