なぜか cakephp上では変な時間(UTC)になってしまう時の対策。
core.phpのtimezoneの設定を確認。
[cc lang=’php’ line_numbers=’false’]
/**
* Uncomment this line and correct your server timezone to fix
* any date & time related errors.
*/
    //date_default_timezone_set(‘UTC’);
[/cc]
timezoneの設定はコメントアウトされてる。
コメントにちゃんと書いて有りますな。
ここのコメント外してあんたのサーバーに合わせた設定にしなさいよと。
言われたとおりに
[cc lang=’php’ line_numbers=’false’]
    date_default_timezone_set(‘Asia/Tokyo’);
[/cc]
Asia/Tokyo に変えて解決。
…と普通ならここで解決するはずが、うちでは全く解決しない。
普段は大丈夫やのにController内で自作Componentを使おうとするとなぜかtimezoneがUTCになってしまう。
とにかく原因究明のために色んなとこでtimezoneがどうなってるのかを調査してみることに。
[cc lang=’php’ line_numbers=’false’]
class FooController extends AppController {
    public $components = array(
        ‘Foo’,
    );
/**
* beforeFilter
*
* @var mixed
*/
    public function beforeFilter() {
        var_dump(date(‘e’));
    }
/**
* index method
*
* @return void
*/
    public function index() {
        var_dump(date(‘e’));
    }
}
[/cc]
どの段階で変わってるのか見るために beforeFilter と index で timezoneをdumpしてみる。
結果 beforeFilter は Asia/Tokyo
index は UTC になってた。
んで public $components を削除してみると今度はちゃんと両方 Asia/Tokyo に。
これで Component が悪さしてるのは間違いない。
でも timezone の変更なんかしてへんぞーと更に調査を進めると…見つかりました。
PHP で Twitter API や OAuth 認証を行うためのライブラリ 「tmhOAuth」のコンストラクタ内で
[cc lang=’php’ line_numbers=’false’]
    // default configuration options
    $this->config = array_merge(
        array(
            //略
            // default timezone for requests
            ‘timezone’ => ‘UTC’,
            //略
        ),
        $config
    );
    date_default_timezone_set($this->config[‘timezone’]);
[/cc]
こんなのが!
思いっきりUTCにセットしちゃってるYO!
configはnewする時に上書き出来るので
[cc lang=’php’ line_numbers=’false’]
$tmhOAuth = new tmhOAuth(
    ‘consumer_key’ => ‘******************’,
    ‘consumer_secret’ => ‘*********************’,
    ‘timezone’ => ‘Asia/Tokyo’,
);
[/cc]
こんな感じにセットしてやって解決。
cakephpのソースまで追っかけてた努力は何だったんだ(ノД`)
