Javaで日付のデータを扱う時に、よく混乱したので自分なりに整理してみました。
日付に関するデータ型
Date
- 特定の日付のデータをミリ秒まで表すことができる
- しかし、時間・分・秒の取得や設定をするメソッドは推奨されていない
- 後述のCalendarクラスで時間・分・秒まで扱える
Calendar
- 日付と時間のフォーマットを行う時に必要な全ての時間フォーマット値を生成できる
- 任意の日時を成形する時などに使える
java.util.Date
-
java.util
はDate型を扱えるパッケージの一つ - 日付データの比較や取得に関するメソッドが継承されている
-
equals
:2つの日付が等しいかどうか比較 -
getDay
:日のデータを取得できる(0 = Sunday, 1 = Monday,...) - などなど
-
java.sql.Date
-
java.sql
はパッケージ - データソース(通常はRDB)に格納されたデータにアクセスして処理するためのAPIを提供するとのこと
- java.sql.Dateで日付を扱う場合、時間・分・秒・ミリ秒を0にする必要がある
日付⇄文字列の変換
Date→String
-
SimpleDateFormat
で出力したい日付のフォーマットを指定する -
format(Date date)
メソッドで文字列に変換
Date date = new Date(); // 今日の日付
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String strDate = dateFormat.format(date);
System.out.println(date); // => Mon Dec 31 10:33:59 JST 2018
System.out.println(strDate); // => 2018-12-31
-
toString()
メソッドを使うと、そのまま文字列になる
Date date = new Date(); // 今日の日付
String strDate = date.toString();
System.out.println(date); // => Mon Dec 31 10:33:59 JST 2018
System.out.println(strDate); // => Mon Dec 31 10:33:59 JST 2018
String→Date
-
parse
メソッドを用いた変換- あらかじめフォーマットを決める必要がある
-
parse
メソッドを使うクラスでParseException
を宣言する必要がある
public static void main(String[] args) throws ParseException{
String strDate = "2018-12-31";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat.parse(strDate);
System.out.println(date); // => Mon Dec 31 00:00:00 JST 2018
}
-
valueOf(String s)
メソッドを用いた変換- valueOfメソッドの戻り値は
java.sql.Date
オブジェクトになる
- valueOfメソッドの戻り値は
String strDate = "2018-12-31";
Date sqlDate = java.sql.Date.valueOf(strDate);
System.out.println(sqlDate); // => 2018-12-31
Date⇄Calendarの変換
Date→Calendar
- Calendarクラスの新規インスタンスを作成
-
setTime(Date date)
メソッドを使ってCalendarクラスのオブジェクトに変換
Date date = new Date(); // 今日の日付
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar);
// =>java.util.GregorianCalendar[time=1546228443561,areFieldsSet=true, ...]
Calendar→Date
-
getTime()
メソッドでDateクラスのオブジェクトに変換
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2018); //年を設定
calendar.set(Calendar.MONTH, 11); //月を設定(※MONTHは0始まり 0→Jan、1→Feb、...になる)
calendar.set(Calendar.DAY_OF_MONTH, 31);//日を設定
Date date = calendar.getTime();
System.out.println(date); // => Mon Dec 31 13:01:05 JST 2018
参考サイト
- Date (Java Platform SE 6)
- Date (Java Platform SE 8 )
- Calendar (Java Platform SE 7 )
- SimpleDateFormat (Java Platform SE 8 )
さいごに
自分が実装したことのある日付データの扱い方についてまとめてみました。
もし「こうした方がいい」「こうすることが多いよ」等あればアドバイスいただけると嬉しいです!
良いお年を!