Javaには日時のフォーマットを指定したり、日付を演算することができるCalendarクラスがあります。
この記事では、
- SimpleDateFormatの使い方
- SimpleDateFormatの注意点
- 日付のフォーマットを変更する方法
- DateFormatクラスでフォーマットを指定する方法
- 日付を比較する方法
- Date型とString型文字列との変換
という基本的な内容から、などの応用的な内容に関しても解説していきます。今回はそんなCalendarクラスについて、さまざまな方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
SimpleDateFormatの使い方
日付や時刻のフォーマットを指定する場合は、SimpleDateFormatクラスを使用します。
SimpleDateFormat オブジェクト名 = new SimpleDateFormat(”フォーマットパターン”)
指定したフォーマットは、formatメソッドの引数に指定された日付を、SimpleDateFormatオブジェクトのパターンに従ってフォーマットします。
オブジェクト名.format(date)
フォーマットパターンを指定することで、さまざまなフォーマットで日付や時刻を表示することができます。SimpleDateFormatクラスを使用するためには、import java.text.SimpleDateFormatを指定します。
指定するフォーマットパターンについては、OracleのAPIに全パターンが記載されています。
https://docs.oracle.com/javase/jp/8/docs/api/java/text/SimpleDateFormat.html
主なパターンは以下の表のとおりです。
文字 | 説明 | パターン | 結果 |
---|---|---|---|
G | 紀元 | G | AD |
y | 年 | yyyy yy | 2017 17 |
M | 月 | MM MMM MMMMM | 03 Mar March |
d | 日 | d dd | 1 01 |
E | 曜日 | E | Wed |
H | 時(0-23) | H HH | 0 00 |
K | 午前/午後の時(0-11) | K KK | 0 00 |
h | 午前/午後の時(1-12) | h hh | 1 01 |
m | 分 | m mm | 0 00 |
s | 秒 | s ss | 0 00 |
S | ミリ秒 | S SSS | 1 001 |
以下に、SimpleDateFormatクラスの基本的な使い方を記述します。
import java.text.SimpleDateFormat; import java.util.Calendar; public class Main { public static void main(String[] args) { Calendar cl = Calendar.getInstance(); // SimpleDateFormatクラスを使用して、パターンを設定する SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); System.out.println(sdf.format(cl.getTime())); } }
実行結果:
2017年03月27日
サンプルではSimpleDateFormatクラスのコンストラクタの引数で、フォーマットパターン“yyyy年MM月dd日”を設定しています。
次にSimpleDateFormatクラスのformatメソッドを使用して、引数にCalendarクラスのgetTimeメソッドを指定すると、パターンを“yyyy年MM月dd日”で設定した、現在の日付が表示されます。
ミリ秒まで表示する方法
ミリ秒まで表示する方法について、サンプルコードで確認しましょう。
import java.text.SimpleDateFormat; import java.util.Calendar; public class Main { public static void main(String[] args) { Calendar cl = Calendar.getInstance(); // SimpleDateFormatクラスを使用して、パターンを設定する SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss.SSS秒"); System.out.println(sdf.format(cl.getTime())); } }
実行結果:
2017年03月27日 15時58分31.789秒
曜日を表示する方法
曜日を表示する方法について、サンプルコードで確認しましょう。
import java.text.SimpleDateFormat; import java.util.Calendar; public class Main { public static void main(String[] args) { Calendar cl = Calendar.getInstance(); // SimpleDateFormatクラスを使用して、パターンを設定する SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E"); System.out.println(sdf.format(cl.getTime())); } }
実行結果:
2017年03月27日 Mon
和暦(元号)で表示する方法
Java6から和暦対応のCalendarクラスが提供されました。和暦に対応するには、Localeクラスを使います。Localeクラスを利用することで、言語や国ごとで異なる単位、記号、日付、通貨をフォーマットすることができます。
和暦で表示する方法について、サンプルコードで確認しましょう。
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; public class Main { public static void main(String[] args) { Locale jp = new Locale("ja", "JP", "JP"); Calendar cl = Calendar.getInstance(jp); // SimpleDateFormatクラスを使用して、パターンを設定する SimpleDateFormat sdf = new SimpleDateFormat("GGGGyy年MM月dd日 E", jp); System.out.println(sdf.format(cl.getTime())); } }
実行結果:
平成29年03月27日 月
SimpleDateFormatの注意点
SimpleDateFormatクラスの注意点として、存在しないフォーマットパターンを指定すると、IllegalArgumentExceptionの例外が投げられますので注意が必要です。
例えば、以下のように指定すると例外となります。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd e”);
これは、日付の後に曜日を指定していますが、曜日は大文字のEで指定する必要があります。パターンのアルファベットは、大文字小文字が明確に区別されますので、注意しましょう。
日付のフォーマットをチェックする方法
存在しないフォーマットパターンかどうかチェックしてから処理することをオススメします。パターンが不正の場合はtry-catch文で例外処理が行われるようにしましょう。
import java.text.SimpleDateFormat; import java.util.Calendar; public class Main { public static void main(String[] args) { Calendar cl = Calendar.getInstance(); try { // SimpleDateFormatクラスを使用して、パターンを設定する SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd e"); System.out.println(sdf.format(cl.getTime())); } catch (IllegalArgumentException e) { System.out.println(e); } } }
実行結果:
java.lang.IllegalArgumentException: Illegal pattern character 'e'
フォーマットを変更する
日付のフォーマットを変更するには、SimpleDateFormatクラスのapplyPatternメソッドを使用します。
SimpleDateFormat型のオブジェクト名.applyPattern(pattern)
引数patternには、変更後のフォーマットを指定します。
applyPatternでyyyymmdd形式に変更
以下にSimpleDateFormatクラスのapplyPatternメソッドを使用した、日付の変更方法を記述します。
yyyy年MM月dd日形式からyyyymmdd形式に変更します。
import java.text.SimpleDateFormat; import java.util.Calendar; public class Main { public static void main(String[] args) { Calendar cl = Calendar.getInstance(); // SimpleDateFormatクラスを使用して、パターンを設定する SimpleDateFormat sdf = new SimpleDateFormat("変更前:yyyy年MM月dd日"); System.out.println(sdf.format(cl.getTime())); //フォーマットを変更する sdf.applyPattern("変更後:yyyyMMdd"); System.out.println(sdf.format(cl.getTime())); } }
実行結果:
変更前:2017年03月27日 変更後:20170327
サンプルではSimpleDateFormatでフォーマットを指定後、applyPatternメソッドでフォーマットを変更しています。
DateFormatを使用する方法
DateFormatクラスでもSimpleDateFormatクラス同様に、日付や時刻を整形することができます。
DateFormatクラスは、new演算子ではなくgetInstanceメソッドを使用してインスタンスを生成します。
DateFormat df = DateFormat.getInstance()
getInstanceメソッドは、呼び出すごとに現在の日付と時間に初期化された状態で、オブジェクトを返します。
DateFormatの使い方
以下に、DateFormatクラスの基本的な使い方を記述します。
import java.util.Date; import java.text.DateFormat; public class Main { public static void main(String[] args) { Date date = new Date(); DateFormat df = DateFormat.getInstance(); System.out.println(df.format(date)); } }
実行結果:
3/27/17 11:24 AM
サンプルではDate クラスとDateFormatクラスのオブジェクトを作成し、Dateクラスが保持している時刻をformatメソッドで整形しています。
日付を比較する方法
日付を比較するにはDateクラスのcompareToメソッドを使って、以下のように記述します。
Date1.compareTo(Date2);
compareToメソッドの戻り値は、
- Date1が引数Date2と等しい場合は値0
- Date1が引数Date2より前の場合は-1
- Date1が引数Date2より後の場合は1
のいずれかを返します。日付の比較についてくわしいことは、こちらのサイトで解説していますので、ぜひ参考にしてください。
Date型とString型文字列との変換
Date型とString型文字列と型変換をする機会は頻繁にありえます。型変換が必要なときは、こちらのサイトで詳しく解説していますので、ぜひさんこうにしてください。
Calendarについてもっと詳しく知りたい方へ
Calendarのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここでは、日付や時刻をフォーマットで指定できるSimpleDateFormatクラスや、DateFormatクラスについて説明しました。日付を扱う処理は、さまざまな場面で使用することがあると思います。
もし、日付や時刻のフォーマットを指定する方法を忘れてしまったら、この記事を思い出してくださいね!