Dateは直接使わない!

Javaを使い始めた頃、一番戸惑う「値」は日時に関するものでしょう。Javaには「日時専用の値」というものは存在しません。Javaは何でもクラスとして用意しますから、日時も当然ですがクラスのインスタンスとして値を作成することになります。ですが、この日時の値をうまく使えているビギナーは、意外に少ないかもしれません。

例えば、「現在の日時を表示する」という処理を考えたとしましょう。あなたなら、どう書くでしょうか。ちょっと考えてみて下さい。
import java.util.*;

public class Sample {

       public static void main(String[] args){
              Date d1 = new Date();
              System.out.println(d1);
       }
}

リストを実行すると、DateのString値が表示される。


ひょっとして、こんなやり方をしていませんか? これでももちろん現在の日時が表示されます。が、このやり方は少々問題があります。何がいけないかというと、「Dateインスタンスをnewして作成し、利用している」という点です。

Dateは、Javaができた当初から用意されている、日時を扱うためのクラスです。が、これを使って日時を表すには、実はかなり問題があるのです。このDateには地域などによる時差やカレンダーによる日付の違いなどといった情報が全く用意されていません。Dateは、ただ単に基準となる日時から現在までどれだけ経過したかという情報しか持っていないのです。このため、現在ではDateを直接作成して日時の値として利用するというやり方はあまりしません。

では、どうするのか。それはCalendarクラスを使うのです。Calendarは、Dateの欠点である地域情報やカレンダー情報などに対応した、新しい「日時のためのクラス」です。といっても、このCalendarクラスは抽象クラスとして用意されているので、直接newすることはできません。通常は、このサブクラスであるGregorianCalendarクラスを利用します。これは、グレゴリオ暦(普段、私たちが使っている暦)のためのCalendarです。
public static void main(String[] args){
       GregorianCalendar cal1 = new GregorianCalendar();
       System.out.println(cal1.getTime());
}

先ほどのリストのmainメソッドを、GregorianCalendarを使った形に修正してみました。newでインスタンスを作成し、printlnする際にはgetTimeというメソッドの値を出力しています。このgetTimeは、CalendarからDateインスタンスを取り出すメソッドです。「なんだ、結局Dateを使うんじゃないか」と思った人。確かにそうなんですが、このDateは、Clendarにより現在の地域、カレンダー情報をもとにして得られたDateなのです。ですから、安心してその値を利用できるわけですね。