ちなみに

火曜日の空は僕を押しつぶした。

Psych でフロースタイルを使っているとタイムスタンプがパース出来なくてはまった話し

YAMLでマスタデータを管理していて、タイムスタンプを含めてたらパースエラーになった。

フロースタイルにして一行に一レコードで管理していたのだけれど、ブロックスタイルだと普通に読み込める。: がキーの区切りに使われているのでパース出来てない気配。

YAML.load("key: {time: 2014-09-09 20:49:24}")
#=> Psych::SyntaxError: (<unknown>): found unexpected ':' while scanning a plain scalar at line 1 column 13

クオートしたら問題ないだろと思ったけどそんなに簡単な話ではなくて文字列になった。

YAML.load("key: {time: '2014-09-09 20:49:24'}")
#=> {"key"=>{"time"=>"2014-09-09 20:49:24"}}

じゃあ、型つければ良いんでしょって試したけどうまくいかなくて、とても悩んだ末に誰かに頼ろうとツイートしてみた。

しかし、落ち着いてもう一度見てみたら明らかにおかしかった。

存在しない時間を書いていたのが原因だった。

YAML.load("key: {time: !timestamp '2014-09-09 20:49:24'}")
#=> {"key"=>{"time"=>2014-09-10 05:49:24 +0900}}

まとめ

  • フロースタイルではそのままタイムスタンプの形式で書いてもエラーになる。
  • クオートしたうえで、!timestamp のように型を付けると回避できる。