9

ユーザーがコメントできるブログがあります。を使用してコメントを投稿した時刻を挿入し、 をNOW()使用date('j M Y', stored timestamp)して投稿した時刻を表示します。

NOW() が を返すかどうかを知りたいですlocatime of the end user or the localtime at my server。ユーザーがコメントを投稿した現地時間を計算するUNIX_TIMESTAMPよりも、使用する方が適していますか。NOW()

4

3 に答える 3

7

この関数NOW()は、MySQL サーバーのタイム ゾーンによって決定される、フォーマットされた日時文字列を生成します。

UNIX_TIMESTAMP()ただし、 GMT で表される を使用して時刻を格納する方がよいでしょう。そうすることで、訪問者の国に合わせてフォーマットすることが容易になります (例: JavaScript を使用)。

それでも列を使用したい場合は、次を使用DATETIMEして時刻を保存できますUTC_TIMESTAMP()(日付は次のようにフォーマットされますNOW()が、UTC で表現されます); 他のすべての面で多かれ少なかれ同じように機能するはずです。

于 2013-02-13T09:12:41.330 に答える
3

マニュアルがNOW()について何と言っているか見てみましょう:

関数が文字列コンテキストで使用されているか数値コンテキストで使用されているかに応じて、現在の日付と時刻を 'YYYY-MM-DD HH:MM:SS' または YYYYMMDDHHMMSS.uuuuuu 形式の値として返します。値は現在のタイムゾーンで表されます

...そしてUNIX_TIMESTAMP() :

引数なしで呼び出された場合、Unix タイムスタンプ('1970-01-01 00:00:00' UTC からの秒数) を符号なし整数として返します。UNIX_TIMESTAMP() が日付引数で呼び出された場合、引数の値を '1970-01-01 00:00:00' UTC からの秒数として返します。date は、DATE 文字列、DATETIME 文字列、TIMESTAMP、または YYMMDD または YYYYMMDD 形式の数値です。サーバーは、日付を現在のタイム ゾーンの値として解釈し、UTC の内部値に変換します。

したがって、まず、それらは異なるものを返します: 適切な日付と整数です。

実際には、次の 3 つの機能を取得する必要があります。

  1. すべての日付を同じ形式 (UTC またはサーバーのタイムゾーン) で保存します。
  2. ユーザーのタイムゾーンを取得する
  3. 保存された日付をユーザーのタイムゾーンで表示

日付と時刻関数の章では、使用可能な関数の概要を説明しています。日付を UTC で保存する場合は、UTC_TIMESTAMP()を使用します。サーバーのタイムゾーンを使用したい場合は、NOW()を使用できます。そして、変換を行うCONVERT_TZ()があります。

ただし、MySQL はポイント 2 の役に立ちません。ユーザーに尋ねるか、JavaScript を使用してユーザーの時計を読み取ってサーバーに送信し、推測できるようにする必要があります (通常、同じ時間を共有する複数のタイム ゾーンがあるため、尋ねない場合は常に推測する必要があります)。与えられた瞬間の時間)。

于 2013-02-13T09:36:29.343 に答える