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("a: {hoge: !timestamp '2008-01-00 00:00:00', piyo: nyan}")
— Tomohiro Nishimura (@tomohi_ro) 2014, 9月 9
しかし、落ち着いてもう一度見てみたら明らかにおかしかった。
うける。2008年1月0日なんか存在しないからだった。 https://t.co/UbCvEG1pLR
— Tomohiro Nishimura (@tomohi_ro) 2014, 9月 9
存在しない時間を書いていたのが原因だった。
YAML.load("key: {time: !timestamp '2014-09-09 20:49:24'}") #=> {"key"=>{"time"=>2014-09-10 05:49:24 +0900}}
まとめ
- フロースタイルではそのままタイムスタンプの形式で書いてもエラーになる。
- クオートしたうえで、
!timestamp
のように型を付けると回避できる。