22

私はカレンダーアプリケーションに取り組んでいます。このユーザーでは、さまざまなタイムゾーンのユーザーがイベントを作成/表示します。イベント時間を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

4

2 に答える 2

34

あなたはこれをあまりにも複雑にしています。を使用して 2 つのタイムゾーンを変換するにはDateTime、次のようにします。

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を更新することで、それらを最新の状態に保つことができます。

于 2012-12-04T08:36:01.583 に答える
9

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

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 が「どの」時間を (調整前/調整後から) 知ることができないため、確実に変換することはできません。これが誰かの審議に役立つことを願っています;-)

于 2013-09-25T11:44:30.710 に答える