DateクラスとCalendarクラスついて

java.util.Dateは日付や時間を扱う際に利用するクラスである。同じ日付を扱うクラスとしてCalenderクラスが存在するが、違いとしてはこのサイトに、

java.util.Date は Unix time (C言語における time_t) をベースにしたもので、後に java.util.Calendar が追加されると、実装が Calendar のコア部分のラッパーに置き換えられました。表現可能な日付・時刻はシステムのローカル時間帯と、内部実装で使用している UTC のみです。 java.util.Calendar は、JDK 1.1 における国際化対応の一環として導入されたもので、既存の java.util.Date の互換性を維持するために別クラスとしたものです。java.util.Date と異なり任意のタイムゾーンの日付・時刻を表現できますが、インタフェースの出来は散々です。なお、こちらも Unix time ベースの実装です。 Date and Time API は、情報通信における日付・時刻表期の国際規格である ISO 8601 をベースに、ユーティリティを追加したフレームワークです。そもそも Unix time と ISO 8601 の間に互換性はないため、java.util.Date/java.util.Calendar との相互変換には手間がかかります。

とある。Dateクラスの上位互換がCalendarクラスと考えて良いだろう。

基本的にはCalendarクラスを使った方が良いが、何かの事情でDateクラスを使わざるを得ない場合は色々と気をつけなければならない。

Dateクラスから時間をString型で取得したい場合、Dateクラスのメソッドは使い勝手が悪い。 toStringメソッドは

dow mon dd hh:mm:ss zzz yyyy

という形で返されるため非常に使い勝手が悪い。getYear、getMonthなどのメソッドも存在するが、使用は推奨されていない。

試しにgetYearを使ってみたところ、2017年が117年に変換されていた。

そのため、String型で取得したい場合は、一度Calenderクラスでオブジェクトを作成するのが良い。

以下は例である。現在の年月日を取得する。

Date date = new Date();

public String getDateString() {
    String year = null;
    String month = null;
    String day = null;

    Calendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    year = Integer.toString(calendar.get(Calendar.YEAR));
    month = Integer.toString(calendar.get(Calendar.MONTH) + 1);
    day = Integer.toString(calendar.get(Calendar.DATE));

    return year + "年" + month + "月" + day + "日";
  }