3

グローバルに表示されるサイトを構築しているため、日付と時刻をタイムゾーンに対応させる必要があります。https://bitbucket.org/pellepim/jstimezonedetectのライブラリを使用して、ユーザーのタイムゾーンと、ユーザーが DST を監視しているかどうかを回復しています。

この情報を取得した後の私の質問は、どうすればよいか少し混乱しています。すべての情報を UTC でデータベースに保存しますが、図書館からオフセットを受け取ると、DST をどのように処理し、それらが北半球または南半球のどちらからのものであるかを確認します。また、サーバー側でどのように処理しますか。私の考えは、PHP の標準 UTC ですべての日付と時刻を処理し、ビューを処理したらオフセットを適用することです。

どんな助けでも大歓迎です。

敬具

4

1 に答える 1

3

まず、jsTimezoneDetectは、ユーザーのタイムゾーンを推測するためにのみ使用する必要があります。正しくない可能性があるため、またユーザーが実際にいるタイムゾーンとは別のタイムゾーンを使用したい場合があるため、ユーザーが構成できる必要があります。少なくとも、ユーザーがログインするシステムがある場合、またはユーザーは時間を入力しています。

物事を表示しているだけの一時的な訪問者の場合、ユーザーがたまたまいるタイムゾーンで時間を表示することは問題ありませんが、jsTimezoneDetectが間違ったタイムゾーンを推測し、夏時間のルールが異なると、1時間間違える可能性があります。jsTimezoneDetectの推測に依存している場合は、ユーザーが推測しているタイムゾーンを明確に表示するようにしてください。

次に、UTC日付をユーザーが構成した(またはjsTimezoneDetectが推測した)タイムゾーンに変換する必要があります。これを行うには、PHPがサポートしているzoneinfo / tz / Olsenデータベース(1つのデータベース、多くの名前)を使用します。

私が見つけることができるPHPでこれを行うためのほとんどのレシピは、php全体のタイムゾーンを設定してから、日付をフォーマットすることを含みます。それをしないでください、それは正気ではありません、phpのタイムゾーンを常にあなたのシステムのタイムゾーンと同じに保ってください。

代わりに、DateTimeライブラリのDateTimeZoneオブジェクトがあり、DateTimeのタイムゾーンを設定してフォーマットするためのサポートがあります。それが前進する方法です。

だからあなたはこのようなことをすることができます。まず、データベースから取得したデータを使用してUTCでDateTimeオブジェクトを作成します。

php > $date = new DateTime('2000-01-01', new DateTimeZone('UTC'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
2000-01-01 00:00:00+00:00

次に、それをユーザーのタイムゾーンに変換できます。

php > $date->setTimezone(new DateTimeZone('Pacific/Chatham'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
2000-01-01 13:45:00+13:45

または別のもの:

php > $date->setTimezone(new DateTimeZone('US/Eastern'));
php > echo $date->format('Y-m-d H:i:sP') . "\n";
1999-12-31 19:00:00-05:00
于 2012-12-06T09:41:42.497 に答える