Dateの使い方

java.util.Dateのまとめ。Java SE 8よりDate And Time APIに変換するため、Instantの出力とInstantによる生成が可能になる。

java.util.Dateのまとめ。Java SE 8よりDate And Time APIに変換するため、Instantの出力とInstantによる生成が可能になる。

概要

Dateクラス図
Figure 1. Dateクラス図

DateはJavaにおける日時クラス。日時の計算などはCalendarで行うため、DateはUNIXエポック(1970年1月1日)からの経過時間を保持する役割(ぐらいしかない)。ただタイムゾーンの有無でCalendarとは異なるため、フィールドなどに利用することは多い。

Date And Time APIの登場により、そちらへ徐々に移行されると考えられる。ただベースの時間体系が全く異なり直接の相互変換もできないため、非推奨にならず維持はされていく可能性が高い(あくまで予想)。

主な特徴は次の通り。

  • 日時を表すクラスで精度はミリ秒。タイムゾーンを持たない。

  • 「Date」というわりには日付だけでなく時刻も表現できる。

  • ベースになっているのはUNIX時間で、保持しているミリ秒値はUNIXエポック(1970年1月1日)からの経過時間。

  • 非推奨のメソッドが多い。後発でCalendarクラスを導入したので、ほとんどはCalendarで対応される。

  • toString()による出力ではデフォルトのタイムゾーンで出力される。ただタイムゾーンは表示されるだけで、保持はされていない。

  • Java SE 8よりDate And Time APIに変換するため、Instantの出力とInstantによる生成が可能になる。

基本的な使い方

生成

コンストラクタから生成すると現在日時のDateが生成できる。内部的には System.currentTimeMillis()から生成している。System.currentTimeMillis()でシステムの時間を取得できる。

現在日時でのDateの生成
Date date = new Date();

指定ミリ秒でも生成可能。このミリ秒はUNIXエポックからの経過時間。

指定ミリ秒でのDateの生成
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis);

比較

Dateにおける比較はミリ秒まで一致しないとtrueにならない。compareTo()も同様。

年月日だけで比較したい場合は、DateUtils#isSameDay()がオススメ(Commons Langではありますが)。

ミリ秒まで一致しないとtrueにならない
Date firstDate = new Date();
Date secondDate = new Date(firstDate.getTime() + 1); //1ミリ秒進める

// 出力:false ミリ秒まで一致しないのでfalse
firstDate.equals(secondDate);

// 出力:-1 compareTo()も同様
firstDate.compareTo(secondDate);

出力

toString()による出力ではデフォルトのタイムゾーンによる表記で出力される。これは出力上そうしているだけで、あくまでもDateがタイムゾーンをもっていない。

toString()による出力
Fri Jul 29 08:56:29 JST 2015

Date And Time APIへの変換

Java SE 8よりDate And Time APIが導入され、Date/CalendarもInstantを介してではあるが変換が可能になっている。詳しい変換方法は次のページにまとめた。

java.sqlパッケージの日時クラス

java.sql日時クラス図
Figure 2. java.sql日時クラス図

DBの日時項目に対応するためjava.sql下にjava.util.Dateを継承した「java.sql.Date」「java.sql.Time」「java.sql.Timestamp」クラスが定義されている。

「java.sql.Date」は「java.util.Date」と型名が同じなので注意する。インポートし間違える可能性が高い。インポートし間違えたとしても継承関係からコンパイルエラーにならない場合も多い。

Appendix A: 参考