2

ユーザーの現地時間を取得してデータベースに保存しようとしています。now()サーバーの時間を返すため、PHP関数を使用できません。

TimezoneOffsetJavaScriptを使用して取得しました:

d = new Date();
alert(d.getTimezoneOffset()/60);

これを使って時間を計算するにはどうすればよいですか?また、MySQL データ型にはどの型を使用すればよいですか?

ありがとう

4

3 に答える 3

3

すべての時間を 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() と互換性のあるユーザーのタイムゾーンのテキスト表現を保存することです。次に、リクエストごとに、認証されたユーザーがいる場合はタイムゾーンを設定でき、すべての日付関数はそれに従います。

于 2009-06-07T16:39:20.330 に答える
1

最初に d.getTimeZoneOffset() の値を (除算せずに) テーブルに INT として格納します。

次に、タイムゾーンを取得するときに、次を実行します。

SELECT `time` AS original_time, DATE_ADD(original_time, INTERVAL `usersettings`.`timezoneoffset` MINUTES) AS new_time FROM `times`

(注:これはテストされていません!)

于 2009-06-07T16:32:07.510 に答える
0

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);
于 2009-06-07T16:30:03.783 に答える