日付を名前のないタイムゾーンに変換する

DateTimeオブジェクトを作成するとき、時間帯(GMTからの時間と分でのシフト)を時間の行で指定できます。たとえば、



 新しいDateTime( '2009-09-30 12:00:00 + 0400'); 




異なるタイムゾーンにある2つの日付がある場合、ある日付の時刻を別の日付のタイムゾーンで見ると便利な場合があります。 両方の日付が上記の方法で初期化された場合(つまり、名前のないタイムゾーンを使用する場合)、「 現在IDを持つゾーンに対してのみこれを実行できます」というエラーが発生します。



それを回避するには、DateTimeの子孫を作成します



クラスCustomDateTimeはDateTimeを拡張します{
 
    パブリック関数setTimezone($ dtz){
         if(!preg_match( '/ ^ [0-9 \ + \-] /'、$ dtz-> getName())){
            親を返す:: setTimezone($ dtz);
         }
 
         $ offset = $ dtz-> getOffset($ this)-$ this-> getTimezone()-> getOffset($ this);
 
         $ this-> modify($ offset。 'second');
 
         $ format = $ this-> format( 'Ymd H:i:s')  $ dtz-> getName();
         $ this-> __ construct($ format);
     }
 }




喜んで使用します:



    パブリック関数testApplyUnnamedTimezoneToOtherDateTime(){
         $ dt1 =新しいCustomDateTime( '2009-09-30T12:00:00-02:00');
         $ dt2 =新しいCustomDateTime( '2009-09-30T12:00:00 + 02:00');
 
         $ dt2-> setTimezone($ dt1-> getTimezone());

         $ this-> assertEquals( '2009-09-30T08:00:00-02:00'、$ dt2-> format( 'c'));
     }



All Articles