8

日付と時刻の処理方法を本格的にリファクタリングする前に、これが機能するかどうかを尋ねたかったのです。

私の質問を組み立てるために、ここに私の問題があります...ユーザーが行った「アクション」を履歴テーブルに保存します。これらのアクションにはタイムスタンプがあります。ユーザーは世界中にいる可能性があるため、タイムゾーンが異なります。履歴にアイテムを表示し、タイムスタンプを自分のローカル タイムゾーンで表示したい。

また、日時フィールドを使用して UTC 時刻形式を単純に保存できることはわかっていますが、タイムスタンプを使用することを選択しているため、デフォルトを現在の時刻に設定できます。

これは私の問題でうまくいきますか?

  1. 私のサーバーのタイムゾーンはロサンゼルスになります

  2. タイムスタンプをタイムスタンプとして MySQL に保存します。私の理解では、タイムスタンプは常に UTC として保存されます。レコードはデフォルトで creation_date として保存されるか、明示的に UTC_TIMESTAMP() を設定します。事実上、データベース内のすべてのレコードは UTC になります。

  3. ユーザーがログインすると、タイムゾーンを取得します (これをユーザー設定としてデータベースに保存します)。この例では、この人物がニューヨークにいるとします。

ここに私の質問があります。これらのいずれかが機能しますか?

  1. a) 履歴データを取得します。すべてのタイムスタンプは、UTC からロサンゼルス時間に自動的に変換されます。各履歴項目について、ロサンゼルスのタイムスタンプをニューヨークのタイムスタンプに変換してエコーします。

また

  1. b) PHP タイムゾーン「date_default_timezone_set」をニューヨークに設定します。履歴データを取得します。すべてのタイムスタンプはまだロサンゼルス時間であり、サーバーはまだロサンゼルス時間です。「date_default_timezone_set」はロサンゼルスのタイムスタンプをニューヨークに自動的に変換するため、各履歴項目についてタイムスタンプをエコーするだけです。

オプション 4b は機能しますか? ロサンゼルス時間からニューヨーク時間に変換するより良い方法はありますか?

一般的にこれを行うより良い方法はありますか?

4

4 に答える 4

5

おっしゃるとおり、Unix のタイムスタンプは常に UTC です。タイムスタンプを UTC でデータベースに保存する場合、現地時間で出力するために必要なことは、PHP のタイムゾーンをユーザーのローカルのタイムゾーンに変更することだけです。タイムスタンプを変換する必要はありません。

<?php

$timeStampFromDatabase = 1325448000;  // 01 Jan 2012 20:00:00 GMT

date_default_timezone_set('America/Los_Angeles');
echo date('r', $timeStampFromDatabase); // Sun, 01 Jan 2012 12:00:00 -0800

date_default_timezone_set('Asia/Hong_Kong');
echo date('r', $timeStampFromDatabase); // Mon, 02 Jan 2012 04:00:00 +0800

タイムゾーンをその場で変更し、引き続きタイムスタンプを日付形式で出力すると、PHP で設定されたタイムゾーンに基づいて「変換」されます。非常に簡単で、特別な処理を行う必要はなく、日付を出力する前にタイムゾーンを設定する限り、タイムゾーンをどこに設定してもかまいませんが、タイムゾーンを設定する前にそれらを読み取ることができます。

于 2012-02-19T20:45:34.220 に答える
3

残念ながら、「date_default_timezone_set」は思ったように機能しませんでした。前の例のように、作業中の日付が既に UNIX タイムスタンプ形式である場合に機能します。ただし、それらは「Ymd H:i:s」でフォーマットされており、唯一変更されるのは GMT オフセットであり、明らかに機能しません。

数時間そわそわした後、時間の変換をどのように処理できたかを次に示します。

$datetime = new DateTime($date_to_convert);
$usertimezone = new DateTimeZone($_SESSION['timezone']); //each user has their own timezone i store in a session (i.e. - "Americas/Los_Angeles")
$datetime->setTimezone($usertimezone);
echo $datetime->format("Y-m-d H:i:s");

次のこともできたと思います。

Pseudo code
strtotime($datetime)
date_default_timezone_set($user_timezone)
echo date(format, $datetime)

上記は、日付関数が指定された $user_timezone でそのロジックを処理するように強制すると思います。後から考えると、すべての $datetime -> unix_timestamp -> $datetime_converted を変換する必要がありますが、これは私が選択したものよりもはるかに優れているとは思えません。

于 2012-02-20T19:35:19.653 に答える
1

タイムスタンプを常に UTC としてデータベースに保存します。これは、タイムゾーンと夏時間に依存しない時点です。これをタイムゾーンでユーザーに表示するには、次のようにします。

$users_timezone = 'Europe/London'; // See PHP documentation for names that can be used.
$date = new DateTime();
$date->setTimestamp($timestamp_from_database);
$date->setTimezone(new DateTimeZone($users_timezone));   
echo $date->format("H:ia jS F Y");
于 2015-02-09T16:53:28.050 に答える