フェイスブックのGraph APIを叩いていたら時間の処理でハマりましたのでここにその原因と対策を記しておきます javascriptだけでお気軽にgetJSONしようとするとぶつかる問題です
タイムゾーンは太平洋時間だ
フェイスブックのイベントの取得をAPI介してやっていたところイベントの開催日時のタイムゾーンがよくわからない てっきり標準時だと思っていたらちがう 調べてみたら太平洋時間(PST)というやつだった これはUTC-8でフェイスブックの本社があるロサンゼルスのタイムゾーンだった 彼らはきっと自分の中心が世界の中心だと思ってるんでしょうね といういやみはともかく、去年一度、標準時に変えたらしいんだけどまたもどしたとかよくわからない とにかく現時点ではPSTです
じゃあこれで日本はUTC+9だから+17時間でめでたしめでたしかというとそうは行かない というのもPSTにはサマータイムがあるのです(やめてほしい) 詳しくはここでもみてください アメリカ / ロサンゼルスの時差と現在時刻 – Time-j.net
今はちょうどサマータイムじゃないのでフェイスブックの時間管理がサマータイムを考慮するかしないかわからないけれど ちょっと調べた限りではしそう というわけでとにかくロサンゼルス時間だろうということで処理していくことにした
ただそうするとjavascriptだけで処理できない なぜならjavascriptには標準時と自分自身のタイムゾーンに基づいた時刻はしらべられるけどそれ以外は調べられない
結局サーバーサイドに頼ることにした(今回はPHPで)
PHPで任意の地域のタイムゾーンを調べる方法
これで標準時とロサンゼルスの時差が取れる サマータイムも考慮してくれているはずです
$date = new DateTime(null , new DateTimeZone('America/Los_Angeles')); $offset = $date->format('O'); //-0800 が返る
javascriptがDateと認識してくれる文字列の形式とGraph API が返す日時の形式の差
これはちょっと余談ですがここも一般的なハマリポイントなので書いておきます
まずGraph APIが返す日時のフォーマットがこんな感じ
2013-02-17T02:00:00
このフォーマットには2つ問題があってひとつは前に書いたとおりPST時間なんだけどその情報が含まれていないこと もうひとつはブラウザによってはDateオブジェクトのパーサーに通らないこと
結論からいえば以下のように置換すればどのブラウザでもOKになる (chrome,safari,firefox,IE7-9で確認)
2013/02/17 02:00:00 GMT-0800
日にちの「-」を「/」に置換 時刻の前の「T」をスペースに置換 末尾にタイムゾーンのオフセットを追加
とにかく日時の処理はいろいろな意味でハマりポイントですね 今後、仕様が変わったりもしかねないし本当にめんどくさいです
Comments