このブログを検索

2013/02/21

MongoDBのDateで検索する際の落とし穴

MongoDbはISODateとして残る。
javascriptのnew ISODate()で登録すると GMTで登録される。
#参考にGMTとUSTはグリニッジ標準時をご覧ください。

これをphpのstrtotime()とかで日付を取得して検索すると
GMTとJSTの+9時間の時差が出る。

参考にphp.iniに「date.timezone = Asia/Tokyo」があった。

例)
(1) new ISODate(2013-01-02 01:00:00) で登録
    GMTで登録される。すなわち JST 2013-01-01 16:00:00である。

(2) 以下のようにphpで検索条件を作る。
  $start_date = new MongoDate(strtotime('2013-01-02 00:00:00'));
  array("_id" => array ('$gte'=>$start_date));

  print( date('T Y-m-d H:i:s',$start_date->sec) ) ; -> JST 2013-01-02 00:00:00'と表示される。

上記(1)をmongoで見るとISODate("2013-01-01T01:00:00Z")のように見えるから
注意しないと間違ってしまう。

登録するときは+09:00した時間で登録するか
あるいは検索条件に−09:00にしないと。。
参考になるサイトをreferenceに貼っておく。

しばらくはphpでnew MongoDate()する際に以下の様にしてる。
$GMT_TimeZone = new DateTimeZone('GMT');
$start_date_Ymd = new MongoDate(
    DateTime::createFromFormat('Y-m-d H:i:s',
        date("Y-m-d 00:00:00", strtotime("-31 days")), $GMT_TimeZone)->getTimestamp() );


MapReduceでISODateで登録された日付を取得して再度登録したら9時間前の時間で登録された。


既に登録済の値:2013/01/02 00:00:00
再度登録した結果:2013/01/01 15:00:00

取得した時にJSTになり再度登録したらGMTとなってしまった。

ややこしいからISODate型を使わない方がいいかも
代わりに容量は損するが。

0 件のコメント:

コメントを投稿