3

一部のデータを MySQL データベースに挿入する PHP MySQL クエリがあり、タイムスタンプが含まれています。

現在、INSERTクエリはNOW()タイムスタンプ列に使用され、次の形式でデータベースに保存されます。2012-07-24 13:13:02

残念ながら、サーバーは私のタイムゾーンにありません。示されているように、America/Los_Angeles としてリストされています。print date_default_timezone_get();

私は次のことを望んでいました:

date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());

;$timefordbLondonEUの代わりに をデータベースに保存するだけです。NOW()

これはそのようなデータを保存する良い方法ですか?

どうもありがとう、

リチャード

[追加テキスト]

MySQL db の Type を に変更DateTimeし、次のことを行いました。

date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time()); 

それは機能していますが、まだ全体的なコンセプトをまだ理解していません。

Assumptions based on your comments:
  1. MySQL = データ型 UTC を持たず、単純に型 INT を使用します。
  2. Unix_TimeStamp() は現在の時刻またはカウントを保存しますか? 1343247227 などの UTC 形式。
  3. UTC は一般的な 0 ポイントからのカウントであるため、そこから任意のタイムゾーンを取得できます。1970 年の基準 0 ポイントより前の日付が必要ないと仮定します。

あなたが言ったことからの私の推測とリードは、UTC として時間を INT (1343247227) として保存し、そこから必要なタイムゾーンを生成することです。ここでも、1970 年の参照 0 ポイントより前の日付を保存する必要はないと仮定します。

同様に、既知のタイムゾーンでdatetime YYYY-MM-DD HH:MM:SSとして保存してから、UTCまたは他のタイムゾーンに変換しないでください。それはすべてかなり面倒です=(

4

1 に答える 1

7

@Petah がコメントで述べたように、時間を UTC で保存し、必要に応じてアプリケーションで変換します。

Unix のタイムスタンプは UTC であるため、通常、時刻をタイムスタンプとしてデータベースに保存します。これにより、最初に UTC に変換して挿入し、次に選択時に UTC から変換するという頭痛と混乱が解消されます。

つまり、時間フィールドをINT型にして、UNIX_TIMESTAMP()挿入時に MySQL の関数を使用するか、関数を使用して PHP からタイムスタンプを取得しtime()ます。

DB からタイムスタンプを取得すると UTC になりますが、 を使用して PHP アプリケーションでdate()表示すると、サーバーのタイムゾーンまたは で設定したもので表示されますdate_default_timezone_set

したがって、次の 2 つのクエリが機能します。

INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP());

// or

$time = time();

$query = "INSERT INTO `table` (id, time) VALUES(NULL, $time);

DB から として選択する場合はDATETIME、次のようにします。

SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1

結果のdt列は の形式になりますyyyy-MM-dd hh:mm:ss

を使用して、PHP で数値のタイムスタンプをフォーマットできます。date()

お使いの PHP バージョンが 64 ビットの場合、1970 ~ 2036 の範囲に限定されません。PHP は 64 ビットのタイムスタンプをサポートBIGINTします。その場合は、必ず MySQL の列を使用してください。

それが役立つことを願っています。

于 2012-07-25T22:45:55.420 に答える