質問: 日付を扱うクラスや、メソッドについて勉強していましたら、Dateインスタンの「getTimeメソッドと」Calendarインスタンスの「getTimeメソッド」 の二つがある?と思うのですが、Dateインスタンスの方のgetTimeメソッドは、Dateインスタンスの内部に格納されている「long値」を取りだす場合に使うもので、Calendarクラスの方のgetTimeメソッドは日付の情報を取得する場合に使うものだと思っているのですが、このような理解で合っていますでしょうか...? また、CalendarクラスのgetTimeメソッドを調べていましたら、「カレンダーから現在の時刻をDATEオブジェクト(java.utilパッケージ)として取得する」と書いてあったのですが、いまいち、DATEオブジェクトとして取得するという部分が分かりません。 どなたか、教えて頂ければ幸いです。
回答: 昔のJavaの日付時刻体系ですね。 まず、DateとCalendarという二つのクラスは、最初期のJavaの設計ミスのせいで生まれたクラスです。 どういう設計ミスかと言えば、地球には時差があることを考慮していなかったというもの。 Java 1.0 にはDateクラスだけがありました。 long型の数値をラップしており、1970年1月1日0時(グリニッジ時刻)からの通しミリ秒数を格納したものです。 単にlong型整数で時刻を扱うのでなくDateクラスを用意したのは、「年」や「時」「分」などの実用的な値を取り出せるようにです。 なのですが、おかしいですね。 「時」が取り出せるといってもそれどこの地域の立場での「時」ですかと。 たとえばlong値が0だったらイギリス在住の立場なら「0時」が取れてほしいですが、日本在住の立場なら「9時」が取れてしかるべきです。 Dateは特定の瞬間を示す、絶対時刻値なので地域を特定しなければ「時」どころか「日」も「月」も「年」も決められないはず、それを返せてしまっていたというおかしな仕様でした。 Java1.1でさっそく対策が打たれます。 Dateはもうただのlongの容れ物ということにして、「どこそこ在住の立場でDateを読み書きする」クラスを追加したのです。それがCalendarです。 だからCalendarインスタンスは「日本時間」という情報を持っています。それは良い。しかし時刻データも持っています。なんでそうしちゃったんだ。 とはいえ、 * Calendarインスタンスを作る * それに、「日本時間です」「何月何日です」「何時何分です」と、地域情報と時刻情報を与える * 「さあできあがったDateインスタンスをください」 この手順でDateインスタンスを作れるようにしたわけです。そして最後の「さあできあがったDateインスタンスをください」がgetTimeメソッドです。メソッド名の命名がひどすぎる。 DateインスタンスはDateインスタンスでgetTimeメソッドを持っていて、これは中身のlong値を取得するメソッドでしたね。これも命名がひどすぎる。 このようにDateとCalendarの設計はひどすぎるので、誰も使っていませんでした。 Joda Timeというよくできたライブラリがあり、これで時刻を表現することが一般的だったのです。 そしてJava本家もさすがにもっとまともな日付時刻体系を新設しました。DateTime APIと呼ばれるもので、Joda Timeの作者がリーダーになって作ったものです。5〜6年前になりますか。 なので、このDateとCalendarの話は昔話をするための豆知識だと思ってください。 もし本で勉強していて出てきたのならその本は古すぎるのでツタヤで売ってしまうのが良いです。