Help us understand the problem. What is going on with this article?

Javaの日付データ型変換(Date, Calendar, String)

More than 1 year has passed since last update.

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オブジェクトになる
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

参考サイト

さいごに

自分が実装したことのある日付データの扱い方についてまとめてみました。
もし「こうした方がいい」「こうすることが多いよ」等あればアドバイスいただけると嬉しいです!
良いお年を!

ayaka105
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした