画面コンポーネントとして現在利用しているPrimeFacesには「Calendar」があります。DateTimePickerのようなコンポです。このコンポには(当然ながら)日付を設定する属性「Value」が存在しているのですが、型はjava.util.Dateで定義されています。
以前にJJUGのイベントに参加した際、「Java標準のDate系は腐っている」という発言があって、初心者な私にとっては「えっ、どういうこと??」と理解できませんでした。
その発言がどういった意図だったのか?は今もわからないのですが、実際に触りだして「あ…」と思うことが色々出てきました。
標準APIなのになぜか非推奨だらけだったり、フォーマット整えるクラスでスレッドアンセーフなものがあったり、そもそもDateとCalendarと似たようなものが2つあるのも「??」という感じだったり…。
そして調べれば調べるほど、とにかく評判が悪くて驚きました。
バグだらけ、とか、パフォーマンス悪いとか…。マジですか;
一方、これ使え!と多くのサイトで書かれていたのが「Joda Time」というライブラリでした。
http://joda-time.sourceforge.net/
うーむ。何ともJavaって不思議な世界です。面白いといえば面白いけど…。
とりあえず、そんなこんなありつつも、1つちゃんと実装してみようと思いやってみました。
現在開発しているプロトタイプでは、サーバサイドで(サーバの)UTC時刻をベースとして、各ログインユーザごとに定義された時差を加味して画面に時間を表示する、という仕様があります。(これ自体の是非もあるとは思いますが…)
C#のフォーム画面だと(C#2.0の知識で書いてます…)
double timeLag = 540;
DateTime utc = DateTime.UtcNow;
dtpQuoteDate.Value = utc.AddMinutes(timeLag);
という感じで、DateTimePickerに表示できます。
これは簡単やろー、とJavaで書いたのですが
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Date now = cal.getTime();
ウォッチみると
now = (java.util.Date) Tue Nov 27 17:48:43 JST 2012
あれ、JSTだ。なんでだろ。と。
じゃあJodaでやってみよー、こっちはDateTimeとかあってC#チックだ〜と
DateTime dt = new DateTime(DateTimeZone.UTC);
Date now = dt.toDate();
で、ウォッチみると不思議なことに、JodaのDateTime型の変数dtでは確かにUTC時刻が入っているのに、toDateかましてDateにいれたら上記と同じJSTに。。。
どゆこと( ̄□ ̄;!?
頭の回転が悪い自分には辛いです。。。
色々調べたらCalendarからDateに変換するとタイムゾーン情報が消えるため、とのこと。なるほど…。
しかし画面コンポの都合上、最終的にはjava.util.Dateを使わざるを得ない。
困った。。
そんな中、後輩君が「これだと動きます」と持ってきたコードがこれです。
LocalDateTime local = new LocalDateTime(DateTimeZone.UTC);
Date now = local.toDate();
ウォッチみると
(java.util.Date) Tue Nov 27 09:12:28 JST 2012
となっていて、時刻は確かにUTCになってるのだけど、JSTってなってる…いいのかこれ。
今日は疲れたので議論含めて持越し。そんなすごいことやろうとしてるわけじゃないのに;