0

私は多くの異なるデータを持ち、すべてが同じタイムゾーンのタイムスタンプでデータベースに保存されている新しいプロジェクトに取り組んでいます、東海岸、何かが経由でロードされる前にサーバーのタイムゾーンがそれに切り替えられていることを確認します

date_default_timezone_set("America/New_York");

しかし、頭を抱えているようには見えません。タイムゾーンを選択できる検索機能が必要です。西海岸のタイムゾーンを選択した場合、PHP部分のみを変更する必要がありますか?または、データベースに別の方法でクエリを実行する必要がありますか?すべてのデータは非常に時間に敏感であり、これを私の頭に巻き付けるのは非常に難しいことが証明されています。

ヘルプやロジックをいただければ幸いです:P

4

1 に答える 1

1

主な問題は、MySQL のタイムゾーンのサポートがばかげていることです。他のほとんどのデータベースではタイムゾーンを datetime 列の一部として定義できますが、MySQL では定義できません。代わりに、接続全体またはサーバー全体のタイムゾーン設定を行う必要があります。

最善の策は、MySQL がすべての日時を GMT / UTC として保存するようにすることです。SET time_zone = 'UTC'これは、接続時に実行することで強制できます。文字セットの設定と同時に行います。接続文字セットを設定していますよ

PHP 側では、 DateTimeDateTimeZoneの組み合わせを使用して、MySQL から日時を取得し、ユーザーのタイムゾーンで表示できます。たとえば2012-11-13 14:15:16、MySQLDATETIME列から日付を取得するとします。PHP 対話型プロンプトから:

php > $from_mysql = '2012-11-13 14:15:16';
php > $utc = new DateTimeZone('UTC');
php > $ts = new DateTime($from_mysql, $utc);
php > $pdt = new DateTimeZone('America/Los_Angeles');
php > $ts_pdt = clone $ts;
php > $ts_pdt->setTimezone($pdt);
php > echo $ts_pdt->format('r'), "\n";
Tue, 13 Nov 2012 06:15:16 -0800

示されているように、UTC が を使用して設定したタイムゾーンでない場合は、UTC であることを明示的に伝えて DateTime を作成するだけですdate_default_timezone_set。DateTime のタイムゾーンを切り替えるのは、新しいものを与えるのと同じくらい簡単です。ここを使っcloneてコピーを作成しました。DateTimes は変更可能であり、誤って上書きしてしまうことがあります。

逆日付計算も同じように機能します。選択内容を UTC に変換し、ネイティブの数値で計算を実行するだけです。

tl;dr:

  • 日時の計算をUTC (GMT) のみで保存および実行する
  • ユーザーのタイムゾーンのみですべての日時を表示する
于 2012-12-28T05:13:40.847 に答える