続続・パースエラーが止まらない

で、何が原因だったかというと。グラフ表示用ライブラリのGruff。
こいつをロードした後に対象のテストを走らせるとエラーになるらしいってことまでは分かったが
直接の原因が何だかさっぱり分からない。もしかして、rails環境特有の現象かな?と疑ってirbで実験してみることに。

Time.now
=> Mon Feb 04 00:31:24 +0900 2008
require 'rubygems'
require 'gruff'
Time.now
=> 月  204 00:31:49 +0900 2008

あれれ??月??2月??表示が変わってるよ???
ちょwwwww。もしかして〜〜〜〜


AWSのソースをみてみる(actionwebservice/lib/actionwebservice/casting.rb)

   when :datetime
     value = "%s/%s/%s %s:%s:%s" % value.values_at(*%w[2 3 1 4 5 6]) if value.kind_of?(Hash)
     value.kind_of?(DateTime) ? value : DateTime.parse(value.to_s)
   end

value.to_sってのをしてパースしている訳だ。


もう一度irbを使って試してみる。

require 'date'
t = Time.now
=> Mon Feb 04 00:43:07 +0900 2008
t.to_s
=> "Mon Feb 04 00:43:07 +0900 2008"
DateTime.parse t.to_s
=> #<DateTime: 212068813387/86400,3/8,2299161>

require 'rubygems'
require 'gruff'
t = Time.now
=> 月  204 00:43:47 +0900 2008
t.to_s
=> "\346\234\210  2\346\234\210 04 00:43:47 +0900 2008"
DateTime.parse t.to_s
=> #<DateTime: 212068883327/86400,3/8,2299161>
t.strftime '%Y/%m/%d'
=> "2008/02/04"

うん、まぁ普通に動いているっぽい。
じゃぁさ。エラーが起こった日付であろう1月31日を入れてやってみる。

require 'rubygems'
require 'gruff'
t = Time.mktime 2008,1,31
=> 木  131 00:00:00 +0900 2008
DateTime.parse t.to_s
ArgumentError: invalid date
        from /usr/lib/ruby/1.8/date.rb:1536:in `new_by_frags'
        from /usr/lib/ruby/1.8/date.rb:1583:in `parse'
        from (irb):4
        from (eval):3

ちょwwwwwww ktkr!!
何かが見えて参りましたぁぁぁ。やっぱり、月の部分がおかしな事になっているのは確定。
きっとある条件下のもとにこの操作を行うと一月繰り上がってしまうんだ!とおもって
安全そうな日付を選んで実験実験

1.upto(12) do |month|
  dt = DateTime.parse(Time.mktime(2008,month,10).to_s)
  puts "#{month}月::#{dt.strftime('%Y/%m/%d')}"
end
1月::2008/02/10
2月::2008/02/10
3月::2008/02/10
4月::2008/02/10
5月::2008/02/10
6月::2008/02/10
7月::2008/02/10
8月::2008/02/10
9月::2008/02/10
10月::2008/02/10
11月::2008/02/11
12月::2008/02/12
=> 1

こ、これってばwwww
もう、笑うしかないっすね。全部2月になってる!!
シカも11月と12月に至っては日にちまで変わってるぅ

さーて、どうしたもんだろうか。こんな致命的な問題だったとは。。。
実際にrailsを走らせて同様の条件を満たす操作をしてみることにした。
rubyのロード関連の挙動がいまいち分かっていないので、取り越し苦労で終わってくれるとよいなぁ
と、期待して。操作開始。

  1. グラフを表示。
  2. AWSinvokeを実行。
  3. 日付を確認。

・・・・・
終了のお知らせです。全部の日付が2月になってるね〜
うほほ〜い。orz