ユーザーの現地時間を取得してデータベースに保存しようとしています。now()
サーバーの時間を返すため、PHP関数を使用できません。
TimezoneOffset
JavaScriptを使用して取得しました:
d = new Date();
alert(d.getTimezoneOffset()/60);
これを使って時間を計算するにはどうすればよいですか?また、MySQL データ型にはどの型を使用すればよいですか?
ありがとう
ユーザーの現地時間を取得してデータベースに保存しようとしています。now()
サーバーの時間を返すため、PHP関数を使用できません。
TimezoneOffset
JavaScriptを使用して取得しました:
d = new Date();
alert(d.getTimezoneOffset()/60);
これを使って時間を計算するにはどうすればよいですか?また、MySQL データ型にはどの型を使用すればよいですか?
ありがとう
すべての時間を UTC で保存し、ユーザーのタイムゾーン オフセットも保存することをお勧めします。これにより、最大限の柔軟性が得られ、実際のデータ (UTC 時間) と表示ロジック (UTC +/- オフセット) の間の適切な分離が可能になります。
ストレージについては、RDBMS 固有の時間フィールドを何度試しても、int フィールドの UNIX タイムスタンプは常に最高の柔軟性と移植性を提供します。
ユーザーのタイムゾーンオフセットを秒単位で保存して、プロセスをさらに簡単にすることができます。したがって、EST (-5) は -18 000 になります。
次に、時間 -/+ ユーザーのオフセットを表示するために、単純な秒の計算が問題なく機能します。
$now = time();
$userTime = $now + $user->getTimezoneOffset();
負の数を追加することは、正の数を減算することと同じであるため、これは問題なく機能します。
編集:
PHP の標準gmdate()関数を使用して、ユーザーのタイムスタンプをフォーマットできます。計算されたタイムスタンプを関数の 2 番目のパラメーターとして渡すだけです。http://ca2.php.net/manual/en/function.gmdate.phpを参照してください。
おっと... date() は現在のロケール対応です。代わりに gmdate() を使用する必要があります。
もちろん、より良いかもしれないまったく異なるアプローチが 1 つあります。それは、PHP の date_default_timezone_set() と互換性のあるユーザーのタイムゾーンのテキスト表現を保存することです。次に、リクエストごとに、認証されたユーザーがいる場合はタイムゾーンを設定でき、すべての日付関数はそれに従います。
最初に d.getTimeZoneOffset() の値を (除算せずに) テーブルに INT として格納します。
次に、タイムゾーンを取得するときに、次を実行します。
SELECT `time` AS original_time, DATE_ADD(original_time, INTERVAL `usersettings`.`timezoneoffset` MINUTES) AS new_time FROM `times`
(注:これはテストされていません!)
PHPs now() を使用して、ユーザーに時刻を表示するときに変換してみませんか。そうすれば、保存された時間はすべて標準であり、他のユーザーに同じ時間を表示するためにトリックを行う必要はありません。
サーバー時間とユーザー時間の間で変換するためのこの便利な小さなコード スニペットを見つけました。ユーザーをローカルにセットアップして保存し、サーバーをローカルに保存する場合は、これを動的な 1 つのサイズですべてのアプローチに簡単に合わせることができます。
http://www.tek-tips.com/viewthread.cfm?qid=1444820&page=1
//set local timezone
date_default_timezone_set("Europe/Paris");
//get server time as a unix timestamp
$unixtime = strtotime($servertime . ' EST'); //append EST to denote New York time
//convert to human readable local time
echo 'server time is '.date('r', $unixtime);