Posted by & filed under FuelPHP, Tech.

Date Stamp
Date Stamp / Plinkk

Observers

ORM を使用する際に便利なのが、レコードの生成/更新時間を自動で記録してくれるこの機能。

(Included – Observers – Orm Package – FuelPHP Documentation)

 

デフォルトでは UNIX タイムスタンプ、オプションで datetime 型で挿入できるのですが

datetime 型で Insert クエリを発行したところ

現在の日本時間より +9 時間進んだ時間が発行される..Why

ads

 

というわけで調べてみました。

FuelPHP のバージョンは V1.1 です。

 

なお、FuelPHP でのタイムゾーン設定は

/fuel/app/config/development/config.php

/**
  * Localization & internationalization settings
  */
'language' => 'ja', // Default language
'language_fallback' => 'en', // Fallback language when file isn't available for default language
'locale' => 'ja_JP.utf8', // PHP set_locale() setting, null to not set
 
/**
  * DateTime settings
  *
  * server_gmt_offset in seconds the server offset from gmt timestamp when time() is used
  * default_timezone optional, if you want to change the server's default timezone
  */
'server_gmt_offset' => 3600 * 9,
'default_timezone' => 'Asia/Tokyo',

Model の Observers 設定は

protected static $_observers = array(
  'Orm\\Observer_CreatedAt' => array(
    'events' => array('before_insert'),
    'mysql_timestamp' => true, // datetime 型で挿入させる
    'property' => 'created', // テーブルカラム名を created に変更
  ),
);

サーバの locale は JST としております。

 

では順を追って。

 

Observers の名前から予測して以下ファイルを確認。

/fuel/packages/orm/classes/observer/createdat.php

 

before_insert のファンクション内で、

\Date::time()->format('mysql')

が使われていたので、 Date クラスを確認。

 

/fuel/core/classes/date.php

public function format($pattern_key = 'local')

時間出力部分に、PHP 標準関数の strftime が使われておりました。

// Create output
$output = strftime($pattern, $this->timestamp);

 

http://php.net/manual/ja/function.strftime.php

ローカルの時刻・日付を、ロケール設定にもとづいてフォーマットします。

 

..そう。ロケール設定に基づいて時間が出力されているため

サーバ側ですでに +9 時間されている時間に対して

FuelPHP の Date 関数を通すことによってさらに +9 時間進められているという。

 

という事で、サーバ側でロケール設定を日本時間に合わせてある場合

FuelPHP のデフォルトロケール設定 (config.php にて設定)は

'server_gmt_offset' => 0,
'default_timezone' => 'Asia/Tokyo',

server_gmt_offset は0のままでよいのかもしれません。

…ってドキュメントにちゃんと書いてありました。

 

http://press.nekoget.com/fuelphp_doc/general/configuration.html

time() を使用する際に、サーバの gmt タイムスタンプのオフセットからのオフセット秒数

ちゃんとドキュメント見ないとあきまへんってことですね。。

 

まとめ

server_gmt_offset の値を設定する時は

FuelPHP をのせるサーバのロケール設定を要確認しましょう!

いじょ。

Related Posts Plugin for WordPress, Blogger...

One Response to “[FuelPHP]ORMのObservers、タイムゾーン設定(Asia/Tokyo)で気をつける事”