読者です 読者をやめる 読者になる 読者になる

ActionWebServiceで:timeを指定してるのにクライアント側がDateTimeで受け取ってしまう

:timeはTimeで受け渡すという意味ではないのかな?

screenshot

:time
Represents a timestamp, will be cast to a Time object

うーん。。。なんでうまくいかないんだろう。


Javaの話だけど、Roundtrip入門

screenshot

Javaコードのjava.util.Dateは、XMLスキーマのxsd:datetimeにマッピングします。しかし、xsd:datetimeはJavaコードにjava.util.Calendarとしてマッピングされ返されます。

というのは関係ありそう。java.util.Date → xsd:datetime → java.util.Calendar。
Rubyの場合、Time → xsd:dateTime → DateTime という動作をしている。


受け取った側でキャストする方法も調べてみる。DateTimeからTimeへの変換は、最新版だとDateTime#to_timeが使えるらしい。

screenshot

Time オブジェクトにしたいんだけど?

最新版では、aDate.to_time とすることができます。 Date、DateTime、Time のそれぞれに、to_date、to_datetime、to_time が定義されています。

でも手元の環境だと未対応だった。残念。


エポックタイムで変換するのを試してみる。

time(3) に相当する値を得るには?

裏技的ですが、aDate.strftime('%s').to_i とするのが簡単です。

こっちはできそう。

irb(main):001:0> require 'date'
=> true
irb(main):002:0> Time.at(DateTime.now.strftime('%s'))
TypeError: can't convert String into time
        from (irb):2:in `at'
        from (irb):2
irb(main):003:0> Time.at(DateTime.now.strftime('%s').to_i)
=> Thu Dec 21 02:21:00 +0900 2006

できた!

screenshot


(追記) Time/DateをDateTimeにする方法もメモ。

  • DateTime.parse(Time.now.to_s)
  • 新しいバージョンならto_*を使う。