0

私は今、大きな混乱に陥っています。mysqlデータベースにコメントテーブルがあります。コメントテーブルには、comment_posted_time(タイプDATETIME)というフィールドがあります。すべてのコメントを次のように並べ替えます

$query = "SELECT * FROM comments ORDER BY comment_posted_time DESC";

さて、これは間違った結果を生み出す可能性があります。例を挙げます。コンピューターの前に2人のユーザーが座っているとします。1人はインドに、もう1人はアメリカにいます。インドの時刻がアメリカから10時間進んでいるとします。最初にインドのユーザーがコメントを投稿し、その現在の現地時間がcomment_posted_time(タイプDATETIME)に保存されます。1時間後、アメリカのユーザーがコメントを投稿し、その現在の現地時間がcomment_posted_time(タイプDATETIME)にも保存されます。現在、データベースでは、American Userから後で投稿されたコメントは最新のコメントとしてカウントされず、並べ替えは正しくありません。

この状況に対処する方法は?

4

4 に答える 4

1

ユーザーの場所に違いはなく、php と mysql は 1 つのサーバーにあるため、時間に問題はありません。php で変換したタイムゾーンで各ユーザーの時間を表示できますが、mysql のデフォルトを変更しないでください。各ユーザーのタイムゾーン。commentsテーブルを設計してcomment_posted_timeデフォルト値NOW()に設定し、挿入クエリでこのフィールドを使用しないでください。したがって、そのフィールドのすべてのレコードは同じタイムゾーンに保存されます。

于 2013-03-10T10:23:21.470 に答える
0

の日付はどのように取得していますcomment_posted_timeか? 通常、これは MySQL サーバーの現在の日付です。クライアント マシンから日時を取得している場合 (これはお勧めしません)、UTC 日時を取得し、それを表示するときに現地時間に変換することができます。

MySQL サーバーから現在の時刻を保存するには、次のようにします。

update comments set comment_posted_time = NOW() where id=...

これはクライアントによって異なります...

于 2013-03-10T10:14:40.630 に答える
0

日付を UNIX_TIMESTAMP に変換し、それで並べ替えることができます。

$query = "SELECT * FROM comments ORDER BY UNIX_TIMESTAMP(comment_posted_time) DESC";

UNIX_TIMESTAMP()のドキュメントについて詳しく読むことができます。

編集

異なるタイムゾーンに関連するcomment_posted_timeを保存しないでください。すべての時間は、GMT などの 1 つのタイムゾーン、または php を実行しているマシンに相対的である必要があります。

于 2013-03-10T10:17:35.357 に答える
0

したがって、ユーザーが異なるタイムゾーンにいるという問題に直面している場合は、それを永続化する前に、常に特定のタイムゾーンへのタイムポイントを計算する必要があります (通常、メインサーバーのタイムゾーン、またはデフォルトの UTC を使用します)。このアプローチを使用すると、両方を行うことができます: タイムポイントで並べ替え、タイムゾーンに合わせて計算されたタイムポイントをユーザーに表示します。

于 2013-03-10T10:17:46.367 に答える