4

ユーザーがメッセージを投稿できる小さなフォーラムを作成しました。私のサーバーは米国にありますが、フォーラムのユーザーベースは台湾にあります (+15 時間)。

誰かがフォームに投稿すると、mySQL データベースに時刻を YYYY-MM-DD HH:MM:SS の形式で保存します。データベースを見てみると、時刻は正確な時刻(台湾の人が投稿した時刻)を表示しています。

ただし、UNIX_TIMESTAMP を使用してデータベースから日付を取得すると、時刻が変更されます。

例:

  1. フォーラムに何か投稿します。私の腕時計の日時は 2009-10-2 11:24am (台湾時間) です。
  2. データベースを調べると、datetime は 2009-10-2 11:24am と表示されています (私の腕時計と同じ時間です。いいですね!)
  3. 次に、UNIX_TIMESTAMP を使用して Web サイトに日付を表​​示すると、2009-10-03 4:22 pm と表示されます (悪い! オフセットが適用されました)。

データベースから日付を照会するときに、UNIX_TIMESTAMP で時刻の変換 (オフセットの適用) を停止する方法はありますか?

追加情報:
PHP を使用して
います PHP のタイムゾーンを台湾に設定しました (date.timezone = Asia/Taipei)
ユーザーが台湾以外のタイムゾーンにいる場合、時刻を台北時間に変換します。このサイトはほぼ 100% 台湾で使用されているため、別のタイムゾーンにいても常に台湾の時間を表示したいだけです。
サイト内のさまざまな場所にさまざまな date() 形式で日付を表示しています。
基本的に、UNIX_TIMESTAMP を使用してデータをクエリするときに時間にオフセットが適用されることを除いて、すべてがうまく機能します。

ありがとう!

4

4 に答える 4

3

特に指示がない限り、MySQL はシステムのデフォルトのタイムゾーン設定を使用します。これにより、発生している問題が説明されます。詳細については、MySQL のタイム ゾーンリファレンス マニュアルを参照してください。私の過去の経験に基づいて、UTC が日付と時刻を保存するための最良の選択であるという結論に達しました。ユーザーに表示するときに、ユーザーのタイムゾーンに変換されます。

可能であれば、DB 内のすべての日付と時刻のエントリを UTC に変更し、使用して PHP でタイムゾーンを構成date_default_timezone_set()し、ユーザーに表示するときとデータベースに保存するときに、適切に変換するようにしてください。UTC 値を保存できない場合は、UTC と同じ方法でタイム ゾーン リファレンス ガイドに従って単純に変換できます。

必要なことは、データベースから生の日付と時刻を取得し、PHP のDateTimeを使用して変換することです。DateTimeZoneも見てください。

于 2009-10-02T21:05:44.480 に答える
2

この問題に対して私が見つけた最高のものは、これを使用することです:

SELECT UNIX_TIMESTAMP(CONVERT_TZ(<<>>,'+15:00','+00:00')) +TIMESTAMPDIFF(second,utc_timestamp(), now())

例: 2012 年 5 月 31 日 23:59:59 (現地時間) のタイムスタンプを取得したいと考えています。SELECT UNIX_TIMESTAMP(CONVERT_TZ('2012-05-31 23:59:59','+15:00','+00:00')) +TIMESTAMPDIFF(second,utc_timestamp(), now())

このようにして、ローカルタイムに対応するタイムスタンプ GMT-0 を取得します。

于 2012-06-07T23:58:51.937 に答える
1

データベースから日付をUnix時間に変換せずに取得し、 strtotime(); を使用するという可能な解決策を見つけました。Unix 時間に変換します。基本的に、SQL を使用して変換する代わりに、php を使用して変換しています。strtotime() < この関数の信頼性がよくわからないので、UNIX_TIMESTAMP を使用している約 100 か所を変更する必要があります (doh!)

他の方法はありますか?

于 2009-10-02T23:57:06.743 に答える