2011-12-11 7 views
4

私はウェブページを作って、Googleカレンダーの次の3つのイベントをホームページに表示しようとしています。私はこのPHP(http://james.cridland.net/code/google-calendar.html)を使って私のXMLフィードにアクセスし、それをHTMLにフォーマットしています。PHPを使用してGoogleカレンダーXMLを解析する - 終了日が1日遅れる

私が抱えている問題は何らかの理由で新しい日が午前11時に始まることです。たとえば、Googleカレンダーに12月20日の10時から1時間続くイベントがある場合、PHPの出力には20日の午前10時から21日の午前11時に終了するイベントが表示されます。それ以外の場合は正常に動作しています。

私は私のGoogleカレンダーアカウントにローカル(ニュージーランド)の時間に私の時間を設定し、PHPでdate_default_timezone_set("Pacific/Auckland");

終了日が

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+date("Z",strtotime($ns_gd->when->attributes()->endTime))); 

で計算恐ろしいラインを使用しているの$ DATEFORMAT日付形式の文字列です。

GoogleカレンダーのXMLはスタートを与え、それぞれ

2011-12-22T10:00:00.000+13:00 
2011-12-23T11:00:00.000+13:00 

の時間を終えると、PHPは午前10時2011年12月22日の期間を計算している2011年12月午後2時23へ

行くいただきましたに?!?!

答えて

1

を:

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)+ 
    date("Z",strtotime($ns_gd->when->attributes()->endTime))); 

strtotimeこのタイプのISO 8601はうまく処理できます。このコード断片は、おそらくstrtotimeがタイムゾーンを破棄し、UTCでdatetimeを返すという仮定のもとに書かれているため、タイムゾーン「訂正」を手動で計算する必要があります。つまり、+date("Z", ...)の略です( "Z"タイムスタンプ - 実際には無視されます)。

あなたの例では、13時間があなたの日付に追加されます。同じ日にはまだ10:00 + 13:00 = 23:00(午後11時)ですが、実際には00:00の新しい日には11:00 + 13:00 = 24:00(午前12時)です。

だから日付を変換するための正しい方法は次のとおりです。

$gCalDateEnd = date($dateformat, strtotime($ns_gd->when->attributes()->endTime)); 
+0

ありがとう、私はそれがそれのようなものであることを知っていた。彼のコードの変更ログで読んだところから、夏時間を考慮するために+日付( 'Z'、...)を使用しようとしていたように聞こえましたが、XMLはGoogleがすでに+13。 –

1

GoogleカレンダーのためのZendのフレームワーク(それは私のために車輪の再発明よりも良い仕事を)試してみてください:この行は確かに恐ろしいですhttp://framework.zend.com/manual/en/zend.gdata.calendar.html(例を見て、彼らは非常に簡単で便利です)

+0

は、私が(そのを非ため、最初は、私は将来的に維持されるにはあまりに複雑なサイトになるだろうことを恐れていたことを使用してに見えました最低限のスキルを持つ人が見ている可能性が高い)。しかし、あまりにも悪く見えない例を見た後、私はそれを行かせるかもしれません。提案していただきありがとうございます! –

関連する問題