4

バックグラウンド


特定の (英国) 時間に設定されているイベントのリストがあります。ユーザーに現地時間でイベントの時間を表示してもらいたい。例: イベントが20:30英国時間に開始する場合、オランダのユーザーには開始時間が と表示され21:30ます。


問題


すべての設定が完了し、イベントを設定する新しいDateTimeオブジェクトを作成しています。ただし、オブジェクトを指定すると、作成したDateTimeZoneオブジェクト+00:00の代わりに表示DateTimeZoneされます。これは、新しい時刻が正しくないことを意味します。20:30そのため、英国時間に設定されていた20:30時間は、21:30.

コード


これは私が書いたコードです。私の知る限り、私がしていることはすべて正しいですが、オブジェクトDateTimeZoneに割り当てられたときはまだ正しくありません。DateTime

デフォルト設定:

date_default_timezone_set('Europe/London');

DateTimeオブジェクトを現地時間に変換するコード:

$user_timezone = Helper::get_user_timezone(); //contains "Europe/Amsterdam"
foreach($events as $event){
    $timestamp = $event->getDatetime()->getTimestamp();
    $local_datetime = new DateTime('@'.$timestamp, new DateTimeZone($user_timezone));
}

入力


次のDateTimeオブジェクトを入力として使用します。

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/London
)

出力


これにより、次のDateTimeオブジェクトが出力されます。

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 1
    [timezone] => +00:00
)

私は何を試しましたか


私は複数のことを試しました。ほとんどの場合、設定した順序に関するものでしたDateTimeZone

  1. オブジェクトDateTimeZoneの作成前にを作成してみました。DateTimeそれが正しいオブジェクトであることを確認し、DateTimeコンストラクターに設定しました。
  2. DateTime最初にタイムスタンプのみをパラメーターとしてオブジェクトを作成し、DateTimeZone後でオブジェクトを設定しようとしました(直接設定すると奇妙な動作を引き起こすバグがある/あったことはわかっていますDateTimeZone)。
  3. ドキュメントEurope/Amsterdamに従って、設定したいタイムゾーン () が正当であることを確認しました。

timestamp?を使用するときに日付を変換できないのではないかと思い始めています。

基本的な要点についてこれらの質問も見ましたが、そのような問題はありません:
1. PHP でタイムゾーン
を変換する 2. DateTime クラスを使用して PHP でタイムゾーンを変換する方法

さらにいくつかフォローしましたが、現時点では見つかりません。

質問


DateTimeオブジェクトが正しくない になっているの はなぜDateTimeZoneですか?

編集


オブジェクトが正しいことを再度確認した後DateTimeZone、次のようになります。

DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)

しかし、新しいDateTimeオブジェクトに設定すると、 と の両方が次のようtimezone_typetimezone変更されます。

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 1
    [timezone] => +00:00
)

timezone_typeとが異なることに気付くでしょうtimezone

4

2 に答える 2