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

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JavaのDateが難しい

言語仕様 JodaTime Date Calendar

画面コンポーネントとして現在利用している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; //本来はマスタで定義された値を入れる

//UTC時刻取得
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ってなってる…いいのかこれ。

今日は疲れたので議論含めて持越し。そんなすごいことやろうとしてるわけじゃないのに;

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村