JavaのDate型とは?

この記事では、Javaの「Date型」について解説します。
Date型とは、日時を扱うデータ型のことです。
Dateクラスが用意されており、日付を表示・取得・計算するときに使えます。
日付のデータをミリ秒まで表示できますが、「時間・分・秒」の取得や設定するメソッドの使用は推奨されていません。
では、実際にDate型を使ってみましょう!
次のように記述します。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main{
public static void main(String[] args){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy'/'MM'/'dd'/('E')'k':'mm':'ss");
System.out.println(sdf.format(date));
}
}
import java.text.SimpleDateFormat; import java.util.Date;
「import java.text.SimpleDateFormat」で、Dateクラスが保持している日付の情報を、指定する書式の文字列に変換できます。
そして、「import java.util.Date;」でDateクラスを使えるようにしましょう!
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy'/'MM'/'dd'/('E')'k':'mm':'ss");
System.out.println(sdf.format(date));
「Date date = new Date();」で、Date型の変数「date」を作成しています。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy'/'MM'/'dd'/('E')'k':'mm':'ss");
上記の部分で、Date型のデータを文字列として表示させるように処理しています。
そして最後に、formatメソッドでdate変数を整形して、出力しています!
実行結果は、次の通りです。
■実行結果 mbp:Desktop potepan$ java Main 2020/12/28/(月)13:21:41
実際の日付は、実行している日時によって変わるはずです!
このように、Date型で日時を取得・表示できます。
Date型で扱える範囲は?

「Date型でどこまでの範囲を扱えるの?」
こんな風に思う人もいるのではないでしょうか?
実際に、扱える範囲を確認してみると、かなり広い範囲の日時を扱えます。
実行結果は、次の通りです。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Main{
public static void main(String[] args){
SimpleDateFormat sdf = new SimpleDateFormat("GGGyyyy年MMM月dd日 HH時mm分ss.S秒");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date min = new Date(Long.MIN_VALUE);
Date max = new Date(Long.MAX_VALUE);
System.out.println("Date型の最小値 = " + sdf.format(min));
System.out.println("Date型の最大値 = " + sdf.format(max));
}
}
■実行結果
mbp:Desktop potepan$ java Main
Date型の最小値 = 紀元前292269055年12月月02日 16時47分04.192秒
Date型の最大値 = 西暦292278994年8月月17日 07時12分55.807秒
このように、最小値は紀元前から、最大値は292278994年までと、十分な範囲で日時を扱っているのです。
Date型の範囲を扱って、日時を比較する方法は次の章で解説します!
Date型を比較する

ここでは、Date型の比較について解説します。
現在の日付と過去・未来の日付を比較する方法に、「beforeメソッド」「afterメソッド」があります。
どちらも、Dateクラスのメソッドです。
記述例は次のようになります。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class Main{
public static void main(String[] args){
Date date = new Date();
Calendar cBefore = Calendar.getInstance();
Calendar cAfter = Calendar.getInstance();
cBefore.set(2020, 11 - 1, 1, 0, 0, 0); // Calendarクラスの month は、実際の月の-1で表されるため調整
cAfter.set(2020, 12 - 1, 31, 23, 59, 59);
Date dateBefore = cBefore.getTime();
Date dateAfter = cAfter.getTime();
System.out.println("今日は2020/11/1よりも前: " + date.before(dateBefore));
System.out.println("今日は2020/11/1よりも後: " + date.after(dateBefore));
System.out.println("今日は2020/12/31よりも前: " + date.before(dateAfter));
System.out.println("今日は2020/12/31よりも後: " + date.after(dateAfter));
}
}
過去・未来の日付を設定するためにCalendarクラスを使用しています。
それぞれ、任意の日時を設定しましょう。
月(month)を設定する際、Calendarクラスだと「実際の月の-1」で表現されるため、-1をして調整しています。
そして、「date.before(dateBefore)」の部分で、date(現在の日時)と過去(dateBefore)をbeforeメソッドで比較しました。
合致していればtrue、そうでなければfalseが返ります。
実行結果は次の通りです。
■実行結果 mbp:Desktop potepan$ java Main 今日は2020/11/1よりも前: false 今日は2020/11/1よりも後: true 今日は2020/12/31よりも前: true 今日は2020/12/31よりも後: false
意図した結果が取得できています!
なお、Calendarクラスについては、以下の記事で詳しく解説しています!
【関連記事】
▶︎【Java入門】日付情報を取得出来るCalendarクラスを理解しよう!
Date型を変換する

この章では、Date型をさまざまな型に変換する方法を見ていきましょう!
Date型と文字列の変換
Date型を文字列に変換するには、冒頭で紹介した記述例のように「SimpleDateFormat」を使います。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main{
public static void main(String[] args){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy'/'MM'/'dd'/('E')'k':'mm':'ss");
System.out.println(date);
System.out.println(sdf.format(date));
}
}
■実行結果
mbp:Desktop potepan$ java Main
Mon Dec 28 16:55:27 JST 2020
2020/12/28/(月)16:55:27
文字列に変換していない場合と比較してみるとわかりやすいですよね。
このように、任意の形式で日時を表示できます。
表示形式は変更できませんが、「toString()メソッド」を使うことでも、文字列に変換可能です。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main{
public static void main(String[] args){
Date date = new Date();
String s = date.toString();
System.out.println(date);
System.out.println(s);
}
}
■実行結果
mbp:Desktop potepan$ java Main
Mon Dec 28 16:57:26 JST 2020
Mon Dec 28 16:57:26 JST 2020
表示としてはData型と同じですが、文字列に変換できました。
一方、文字列をDate型にしたい場合は、「parseメソッド」が使えます。
parseメソッドは、SimpleDateFormatクラスで実装されており、文字列をDateクラスの値として返します
また、ParseExceptionをthrowするメソッドでもあるため、次のように記述して使いましょう。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;
public class Main{
public static void main(String[] args){
try {
String s = "2020/12/28(月)16:59:38";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd(E)k:mm:ss");
Date date = dateFormat.parse(s);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
■実行結果
mbp:Desktop potepan$ java Main
Mon Dec 28 16:59:38 JST 2020
実行結果を見てわかるように、文字列で指定した情報がDate型に変換できています!
また、valueOfメソッドを用いても変換可能です。
文字列で表した日付を、SQLのDate型である「yyyy-mm-dd」で記述します。
記述例は次の通りです。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main{
public static void main(String[] args){
String s = "2020-12-28";
Date date = java.sql.Date.valueOf(s);
System.out.println(date);
}
}
■実行結果
mbp:Desktop potepan$ java Main
2020-12-28
Date型とCalendar型の変換
Date型からCalendar型に変換する記述例は、次の通りです。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class Main{
public static void main(String[] args){
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
System.out.println(c.getTime().toString());
}
}
■実行結果
mbp:Desktop potepan$ java Main
Mon Dec 28 17:18:22 JST 2020
一方、Calendar型からDate型に変換する記述例は、次の通りです。
■記述例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class Main{
public static void main(String[] args){
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2020);
c.set(Calendar.MONTH, 12 - 1); // Calendarクラスの month は、実際の月の-1で表されるため調整
c.set(Calendar.DAY_OF_MONTH, 28);
Date date = c.getTime();
System.out.println(date);
}
}
■実行結果
mbp:Desktop potepan$ java Main
Mon Dec 28 17:21:16 JST 2020
「getTime()」を使用しているため、時間まで取得できています。