SimpleDateFormatクラスはJavaで日付のフォーマットを変更したり、文字列を日付オブジェクトに変えたりするために利用されるクラスだ。
このページではサンプルコードも含めてSimpleDateFormatについて解説した。日付の書式を変更したいときに利用いただければと思う。
目次
JavaのSimpleDateFormatクラス
SimpleDateFormatクラスは、日付オブジェクトの書式を設定した文字列に変換して表示したり、文字列を日付オブジェクトに変換したりするjava.textパッケージにあるクラスだ。
同じくjava.textパッケージにあるDateFormatクラスを継承している。そのためDateFormatクラスのメソッドも使用できるのでAPIを調べるときは気を付けよう。
まずはJavaでの日付フォーマットのルールを確認しよう。
Javaでの日付フォーマット
日付フォーマットのルールは次の通りだ。
文字 |
意味 |
例 |
yy |
西暦年(2桁) |
2016年 → 16 |
yyyy |
西暦年(4桁) |
2016年 → 2016 |
M |
月 |
9月 → 9 |
MM |
月(ゼロ埋め) |
9月 → 09 |
D |
年に対する日 |
9月5日 → 249 |
DDD |
年に対する日(ゼロ埋め) |
1月1日 → 001 |
d |
月に対する日 |
9月5日 → 5 |
dd |
月に対する日(ゼロ埋め) |
9月5日 → 05 |
w |
年に対する週 |
2016年9月5日 → 37 |
W |
月に対する週 |
2016年9月5日 → 2 |
E |
曜日 |
2016年9月5日 → 月 |
F |
月に対する曜日番号 |
2016年9月5日 → 1 |
a |
午前午後 |
17時56分 → 午後 |
h |
時(12時間制) |
17時 → 5 |
hh |
時(12時間制 ゼロ埋め) |
17時 → 05 |
H |
時(24時間制) |
17時 → 17 |
HH |
時(24時間制 ゼロ埋め) |
6時 → 06 |
m |
分 |
9分 → 6 |
mm |
分(ゼロ埋め) |
9分 → 09 |
s |
秒 |
6秒 → 6秒 |
ss |
秒(ゼロ埋め) |
3秒 → 03秒 |
S |
ミリ秒 |
99ミリ秒 → 99 |
SSS |
ミリ秒(ゼロ埋め) |
99ミリ秒 → 093 |
ここからは細かい説明に入っていくが、とりあえずの使い方を知りたいという方はサンプルコードまで飛んでいただければと思う。下の方に用意しているので、そこまでカーソルを。
コンストラクタ
コンストラクタは次のようになっている。
SimpleDateFormat()
引数 |
なし |
内容 |
デフォルトパターン(yy/MM/dd H:mm)と日付フォーマット記号を使って SimpleDateFormat を生成する。 |
SimpleDateFormat(String pattern)
引数 |
pattern 日付・時刻の書式(パターン) |
内容 |
引数で渡されたパターンとデフォルトの日付フォーマット記号を使って SimpleDateFormat を生成する。 |
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
引数 |
pattern 日付・時刻の書式(パターン) formatSymbols 日付フォーマット記号 |
内容 |
引数で渡されたパターンと日付フォーマット記号を使って SimpleDateFormat を生成する。 |
主なメソッド
続いてメソッドだ。SimpleDateFormatでは次のような各種メソッドが用意されている。
文字列を日付フォーマットにする
SimpleDateFormatオブジェクト. applyPattern (String pattern)
戻り値の型 |
void |
内容 |
指定されたパターン文字列を、この日付フォーマットに適用する。 引数: pattern - この日付フォーマットのための新しい日付と時刻のパターン 例外: ・指定されたパターンが null の場合NullPointerExceptionが発生する。 - 指定されたパターンが正しくない場合IllegalArgumentException が発生する。 |
指定されたDateを日付文字列にフォーマットする
SimpleDateFormatオブジェクト.format(Date date)
戻り値の型 |
Public StringBuffer |
内容 |
指定された Date を日付/時刻文字列にフォーマットし、指定された StringBuffer に結果を追加する。 引数: date - 日付/時刻文字列にフォーマットする日付/時刻値 戻り値: フォーマットされた日付/時刻文字列 例外: 指定された日付が null の場合、実行時にNullPointerExceptionが発生する。 |
文字列から解析してDateオブジェクトを生成する
SimpleDateFormatオブジェクト.parse(String text)
戻り値の型 |
Public Date |
内容 |
文字列からテキストを解析して Date オブジェクトを生成する。 引数: text - 部分的に解析される String 戻り値: 文字列から解析される Dateオブジェクト。エラーの場合は null を返す 例外: text が null の場合NullPointerException が発生する。 |
上と同じだが、エラー時の処理が違う
SimpleDateFormatオブジェクト.parse(String text, FieldPosition pos)
戻り値の型 |
Public Date |
内容 |
文字列からテキストを解析して Date オブジェクトを生成する。 エラーが発生した場合、posへエラーインデックスが設定されDateオブジェクトにはnullが設定される。 引数: text - 部分的に解析される String pos - 上記のインデックスおよびエラーインデックス情報を持つ ParsePosition オブジェクト 戻り値: 文字列から解析される Dateオブジェクト。エラーの場合は null を返す 例外: text または pos が null の場合NullPointerException が発生する。 |
日付フォーマットを記述するパターン文字列を返す
SimpleDateFormatオブジェクト.toParttern()
戻り値の型 |
Public String |
内容 |
この日付フォーマットを記述するパターン文字列を返します。 戻り値: この日付フォーマットを記述するパターン文字列 |
SimpleDateFormatクラスのサンプルコード
それでは実際のサンプルコードを確認していこう。
日付オブジェクトから文字列へ変換するサンプルコード
1 2 3 4 5 6 7 8 9 10 11 |
public class SimpleDateFormatSample { public static void main(String[] args) { Date today = new Date(); System.out.println("書式を設定せずに表示:" + today);//[1] SimpleDateFormat format1 = new SimpleDateFormat(); System.out.println("日付書式の初期値:" + format1.toPattern());//[2] System.out.println("初期設定の書式で表示:" + format1.format(today));//[3] SimpleDateFormat format2 = new SimpleDateFormat("yyyy年MM月dd日 E曜日 H時mm分"); System.out.println("yyyy年MM月dd日 E曜日 H時mm分の書式で表示:" + format2.format(today));//[4] } } |
実行結果
1 2 3 4 |
書式を設定せずに表示:Mon Sep 05 16:59:21 JST 2016 日付書式の初期値:yy/MM/dd H:mm 初期設定の書式で表示:16/09/05 16:59 yyyy年MM月dd日 E曜日 H時mm分の書式で表示:2016年09月05日 月曜日 16時59分 |
サンプルコードの説明
- [1] Dateオブジェクトtodayを生成し、実行時の日時情報を取得。書式は表示せずに表示。
- [2] SimpleDateFormatオブジェクトformat1を引数なしで生成。toPatternメソッドを使って初期値として設定されている書式パターンを表示。
- [3] todayを、formatメソッドを使用してのformat1の書式の文字列に変換して表示。
- [4] SimpleDateFormatオブジェクトformat2を「yyyy年MM月dd日 E曜日 H時mm分」の書式パターンで生成。todayをformatメソッドを使ってformat2の指定書式の文字列に変換して表示。
文字列を日付オブジェクトへ変換するサンプルコード
続いては、文字列を日付オブジェクトへ変換するコードだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class SimpleDateFormatSample1 { public static void main(String[] args) { SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd"); String strDate = "2016/09/15"; ParsePosition pos = new ParsePosition(0); Date date = fmt.parse(strDate, pos);//[1] System.out.println(strDate + "をDateオブジェクトへ変換 → " + date);//[2] System.out.println("変換時のエラー位置 → " + pos.getErrorIndex());//[3] String strDate1 = "2016//09/15"; pos = new ParsePosition(0); date = fmt.parse(strDate1, pos);//[4] System.out.println(strDate1 + "をDateオブジェクトへ変換 → " + date);//[5] System.out.println("変換時のエラー位置 → " + pos.getErrorIndex());//[6] try { date = fmt.parse(strDate1);//[7] } catch (ParseException ex) { System.out.println("エラーが発生しました。" + ex);//[8] } } } |
実行結果
1 2 3 4 5 |
2016/09/15をDateオブジェクトへ変換 → Thu Sep 15 00:00:00 JST 2016 変換時のエラー位置 → -1 2016//09/15をDateオブジェクトへ変換 → null 変換時のエラー位置 → 5 エラーが発生しました。java.text.ParseException: Unparseable date: "2016//09/15" |
サンプルコードの説明
- [1]パターンyyyy/MM/ddを設定したSimpleDateFormatオブジェクトfmtを生成。”2016/09/05”を代入した変数strDateをparseメソッドを使用してDateオブジェクトdateへ変換。
- [2] dateを表示。
- [3] 文字列を日付型に変換する際の解析位置を保持するParsePositionオブジェクトの変数posのエラー位置を表示。エラーがなかった場合は「-1」が表示される。
- [4] 日付としては不正な文字列”2016//09/05”を代入した変数strDate1を、paseメソッドを使用してDateオブジェクトへ変換。
- [5] エラーが発生することなく処理は実行されるが、生成されたDateオブジェクトを表示するとnullとなる。
- [6] 解析エラー発生位置「5」が表示される。[7] parseメソッドで変換する際に、ParsePositionオブジェクトは渡さず文字列だけ渡して文字列からDateオブジェクトへの変換処理を実行すると、実行時にエラー発生。
まとめ
このページでは、Javaで日付のフォーマットを変更できるSimpleDateFormatクラスについてまとめてきた。
日付のフォーマットを思うように決めたいときは、プログラミングをしていてよくあることだ。SimpleDateFormatは活用できるようにしておこう。
日付フォーマットのルールは次の通りだ。
hh時(24時間制)???
hh時は(12時間制 ゼロ埋め)では?
おっしゃる通りですね。ご指摘ありがとうございます。修正いたします。