web-dev-qa-db-ja.com

PHPによるDST処理付きのタイムゾーン

私はカレンダーアプリケーションに取り組んでいます。このユーザーでは、異なるタイムゾーンのユーザーがイベントを作成/表示します。以下の方法に従って、UTCでイベント時間を節約し、ユーザーのローカル時間で表示することを考えています。注:ユーザーは自分の好みのタイムゾーン設定を持っています。

イベントの開始時刻をUTCタイムスタンプとして保存するには:

$timezone = new DateTimeZone( $user_timezone_name );
$utcOffset = $timezone->getOffset( new DateTime( $event_start_time_string_local ) );
$event_start_timestamp_local = maketime( $event_start_time_string_local );
//Now add/subtract $utcOffset to/from $event_start_timestamp_local to get event's start  //time  timestamp in UTC and save this result in DB.

ユーザーのタイムゾーンでイベントの開始時刻を取得するには:

date_default_timezone_set( $user_timezone_name );
$eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC );

どこ:

user_timezone_name is user's timezone setting.
event_start_time_string_local is event's start time string in local/civil time.
event_start_timestamp_in_UTC is event's start time timestamp in UTC.

私の質問:

  • 上記で使用されているPHP APIがすべてのリージョンのDSTを処理するかどうか。
  • DSTの時間自体は年ごとに変化しますが、PHPはこれに関する情報をどのように取得しますか? PHPをアップグレードする必要がありますか?もしそうなら、すべてまたは特定のPHPライブラリをアップグレードする必要がありますか?

参照:- does-phps-date-default-timezone-set-adjust-to-daylight-saving - get-timezone-offset-for-a-given-location

18
Krishna Shetty

これは複雑すぎます。 DateTimeを使用して2つのタイムゾーン間で変換するには、次のようにします。

date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server

$date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER's timezone
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s');

これにより、ユーザーのローカルタイムゾーンからUTCに変換されます。逆に、ユーザーのローカル時間で時刻を表示するには、2つのタイムゾーンを入れ替えます。

はい、PHPはDSTを処理します。必要な変換ルールはPHPインストールの一部です。PHPを更新するか、 timezonedbの更新: http://pecl.php.net/package/timezonedb

25
deceze

はい、php apiはDSTを考慮に入れます。ほとんどの場合、decezeが示した方法で時間変換を安全に実行できます。問題は、それが常に可能/実行可能であるとは限らない、または意味をなさないことです。以下の例を検討してください-ポーランド(2013年)の10月27日午前3時に時計を1時間戻し、標準時間(オフセットUTC + 01:00)に3月31日午前2時に時計を1時間進めて夏に切り替えます時間(オフセットUTC + 02:00)。 Grenwich/UTCでの「リアルタイム」の目盛りと、PHPによるヨーロッパ/ワルシャワからUTCへの変換)の仕組みを見てみましょう。

Europe/Warsaw time   offset  UTC                    php2utc conversion   php offset
2013-10-27 01:00:00    +2    2013-10-26 23:00:00    2013-10-26 23:00:00  +2
2013-10-27 01:30:00    +2    2013-10-26 23:30:00    2013-10-26 23:30:00  +2
2013-10-27 02:00:00    +2    2013-10-27 00:00:00    2013-10-27 01:00:00  +1  *
2013-10-27 02:30:00    +2    2013-10-27 00:30:00    2013-10-27 01:30:00  +1  *
2013-10-27 02:59:00    +2    2013-10-27 00:59:00    2013-10-27 01:59:00  +1  *
     3am -> 2am .....................................summer time changes to standard(winter) time @3am we subtract 1h so 3am becomes 2am
2013-10-27 02:00:00    +1    2013-10-27 01:00:00    2013-10-27 01:00:00  +1
2013-10-27 02:30:00    +1    2013-10-27 01:30:00    2013-10-27 01:30:00  +1
2013-10-27 03:00:00    +1    2013-10-27 02:00:00    2013-10-27 02:00:00  +1  
2013-10-27 03:30:00    +1    2013-10-27 02:30:00    2013-10-27 02:30:00  +1  

午前2時から午前3時の間にわかるように、方法はありませんPHPは「調整」の前後(調整前/調整後)の時間を知ることができるため、確実に変換できません。これが彼/彼女の誰かを助けることを願っています審議;-)

6
Artur