SimpleDateFormatクラス
広告
SimpleDateFormatクラスはDateFormatクラスの実装クラスで、より細かいフォーマット方法を指定できます。
まず下記のクラス図を見てください。
java.lang.Object
java.text.Format
java.text.DateFormat
java.text.SimpleDateFormat
public class SimpleDateFormat extends DateFormat
コンストラクタは4つ用意されています。
コンストラクタ |
SimpleDateFormat() デフォルトロケールのデフォルトパターンと日付フォーマット記号を使って SimpleDateFormat を構築します。 |
SimpleDateFormat(String pattern) 指定されたパターンとデフォルトロケールのデフォルト日付フォーマット記号を使って SimpleDateFormat を構築します。 |
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) 指定されたパターンと日付フォーマット記号を使って SimpleDateFormat を構築します。 |
SimpleDateFormat(String pattern, Locale locale) 指定されたパターンと指定されたロケールのデフォルト日付フォーマット記号を使って SimpleDateFormat を構築します。 |
コンストラクタではパターンを指定します。2番目のコンストラクタを見てみます。
public SimpleDateFormat(String pattern)
指定されたパターンとデフォルトロケールのデフォルト日付フォーマット記号
を使って SimpleDateFormat を構築します。注: このコンストラクタはすべて
のロケールをサポートするわけではありません。すべてをカバーするには、
DateFormat クラスのファクトリメソッドを使用してください。
パラメータ:
pattern - 日付と時刻のフォーマットを記述するパターン
例外:
NullPointerException - 指定されたパターンが null の場合
IllegalArgumentException - 指定されたパターンが正しくない場合
パターンの具体的な記述方法ですが、下記の規則に従って記述します。
文字 | 日付または時刻のコンポーネント | 表示 | 例 |
G | 紀元 | テキスト | AD |
y | 年 | 年 | 1996; 96 |
M | 月 | 月 | July; Jul; 07 |
w | 年における週 | 数値 | 27 |
W | 月における週 | 数値 | 2 |
D | 年における日 | 数値 | 189 |
d | 月における日 | 数値 | 10 |
F | 月における曜日 | 数値 | 2 |
E | 曜日 | テキスト | Tuesday; Tue |
a | 午前/午後 | テキスト | PM |
H | 1日における時 (0 ~ 23) | 数値 | 0 |
k | 1日における時 (1 ~ 24) | 数値 | 24 |
K | 午前/午後の時 (0 ~ 11) | 数値 | 0 |
h | 午前/午後の時 (1 ~ 12) | 数値 | 12 |
m | 分 | 数値 | 30 |
s | 秒 | 数値 | 55 |
S | ミリ秒 | 数値 | 978 |
z | タイムゾーン | 一般的なタイムゾーン | Pacific Standard Time; PST; GMT-08:00 |
Z | タイムゾーン | RFC 822 タイムゾーン | -0800 |
上記で書かれている"文字"の組み合わせで指定します。それぞれの文字は何個繰り返し使うかで表示方法が異なってきます。実際の使い方とパターン毎の結果については例えば下記のようになります。
SimpleDateFormat sdf1 = new SimpleDateFormat("y.M");
System.out.println(sdf1.format(new Date()));
ここで使ってるformatメソッドは親クラスのDateFormatクラスで用意されているformatメソッドを使っています。
パターン毎の結果
"y.M" 05.9
"yy.MM" 05.09
"yyy.MMM" 05.9
"yyyy.MMMM" 2005.9月
"yyyyy.MMMMM" 02005.9月
上記のように何回繰り返し指定するかで結果は変わってきます。また先ほどの一覧表の"表示"というところに書かれている"テキスト"、"年"、"月"、"数値"の種類によって、繰り返した回数をどう処理するかが変わってきます。1つ1つ見ていきます。
テキスト
テキストは次のように書かれています。「パターン文字の数が 4 以上の場合、フォーマットにはフル形式を使用します。そうでない場合、短い形式または省略された形式があれば、それを使用します」。
実際にテキストタイプのG(紀元)、E(曜日)、a(午前/午後)について試した結果を下記に記載します。
"G.E.a" 西暦.土.午後
"GG.EE.aa" 西暦.土.午後
"GGG.EEE.aaa" 西暦.土.午後
"GGGG.EEEE.aaaa" 西暦.土曜日.午後
"GGGGG.EEEEE.aaaaa" 西暦.土曜日.午後
"GGGGGG.EEEEEE.aaaaaa" 西暦.土曜日.午後
紀元と午前/午後については省略形が無いようでどのパターンでも同じでした。曜日については4以上でフル形式、3以下の場合で省略形が表示されました。
ロケールにLocale.USを指定した場合も試してみました。
"G.E.a" AD.Sat.PM
"GG.EE.aa" AD.Sat.PM
"GGG.EEE.aaa" AD.Sat.PM
"GGGG.EEEE.aaaa" AD.Saturday.PM
"GGGGG.EEEEE.aaaaa" AD.Saturday.PM
"GGGGGG.EEEEEE.aaaaaa" AD.Saturday.PM
Locale.USの場合も同じような感じとなります。
年
年については次のように書かれています。「パターン文字の数が 2 の場合、フォーマットには年が 2 桁に短縮されます。そうでない場合は、数値として解釈されます」。
実際に試してみます。
"y" 05
"yy" 05
"yyy" 05
"yyyy" 2005
"yyyyy" 02005
"yyyyyy" 002005
上記はLocale.USの場合も同様でした。パターンが3の場合は"005"になるかと思いましたが、年には2桁か4桁かしかないかと思います。4桁の場合はパターンが5以上の場合は頭に0が付くようです。
月
月については次のように書かれています。「パターン文字の数が 3 以上の場合、フォーマットには月がテキストとして解釈されます。そうでない場合は、数値として解釈されます」。
実際に試してみます。
"M" 9
"MM" 09
"MMM" 9
"MMMM" 9月
"MMMMM" 9月
"MMMMMM" 9月
パターンが1及び2の場合は数字として、3以上の場合は、3の場合は数字部分だけ、4以上の場合はフル形式で表示されているかと思います。ちなみに12月に時間を進めて試していみると下記のようになりました。
"M" 12
"MM" 12
"MMM" 12
"MMMM" 12月
"MMMMM" 12月
"MMMMMM" 12月
Locale.USの場合は下記のようになりました。
"M" 9
"MM" 09
"MMM" Sep
"MMMM" September
"MMMMM" September
"MMMMMM" September
数値
数値については次のように書かれています。「フォーマットには、パターン文字の数は最小桁数になります。これより短い数値は、この桁数までゼロが追加されます」。
実際に試してみます。
"w.W.D.d.F" 37.2.253.10.2
"ww.WW.DD.dd.FF" 37.02.253.10.02
"www.WWW.DDD.ddd.FFF" 037.002.253.010.002
"wwww.WWWW.DDDD.dddd.FFFF" 0037.0002.0253.0010.0002
"wwwww.WWWWW.DDDDD.ddddd.FFFFF" 00037.00002.00253.00010.00002
パターン数が数字を表示するのに足りない場合は、数字を全部表示し、パターン数が数字よりも多い場合には0で埋められるようです。Local.USの場合も同じ結果となりました。
時間関係の試した結果は下記のようになります。
"H.k.K.h.m.s.S" 23.23.11.11.7.18.62
"HH.kk.KK.hh.mm.ss.SS" 23.23.11.11.07.18.62
"HHH.kkk.KKK.hhh.mmm.sss.SSS" 023.023.011.011.007.018.062
"HHHH.kkkk.KKKK.hhhh.mmmm.ssss.SSSS" 0023.0023.0011.0011.0007.0018.0062
同じような感じとなります。
タイムゾーン
タイムゾーンについてはよく分かっていないのですが、実際に試した結果を下記に記述します。
"z.Z" JST.+0900
"zz.ZZ" JST.+0900
"zzz.ZZZ" JST.+0900
"zzzz.ZZZZ" 日本標準時.+0900
"zzzzz.ZZZZZ" 日本標準時.+0900
"zzzzzz.ZZZZZZ" 日本標準時.+0900
Locale.USにした場合は下記のようになります。
"z.Z" JST.+0900
"zz.ZZ" JST.+0900
"zzz.ZZZ" JST.+0900
"zzzz.ZZZZ" Japan Standard Time.+0900
"zzzzz.ZZZZZ" Japan Standard Time.+0900
"zzzzzz.ZZZZZZ" Japan Standard Time.+0900
パターンの中に文字を入れる場合
'A' ~ 'Z' および 'a' ~ 'z' は全て予約済みとなっており、これらの文字を文字列としてパターンの中に入れたい場合は単一引用符 (') で囲んで入れることができます。例えば下記のようになります。
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss z");
System.out.println(sdf1.format(new Date()));
上記では"at"という文字を表示させています。実際の実行結果は下記のようになります。
2005.09.10 at 23:37:57 JST
単一引用符そのものを表示させたい場合は、「''」のように記述します。
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy.MM.dd 'at' ''HH:mm:ss z''");
System.out.println(sdf1.format(new Date()));
実行結果は下記のようになります。
2005.09.10 at '23:40:23 JST'
メソッドでのパターン指定
パターンはコンストラクタで指定する以外にapplyPatternメソッドでも指定が可能です。
public void applyPattern(String pattern)
指定されたパターン文字列を、この日付フォーマットに適用します。
パラメータ:
pattern - この日付フォーマットのための新しい日付と時刻のパターン
例外:
NullPointerException - 指定されたパターンが null の場合
IllegalArgumentException - 指定されたパターンが正しくない場合
使い方はコンストラクタで指定する場合と同じです。
実際の使い方
SimpleDateFormatは直接インスタンスを作成することもできますが、DateFormatクラスのgetDateTimeInstanceメソッドを使った作成したインスタンスをSimpleDateFormatクラスにキャストして使った方がいいようなことが記載されています。できればファクトリメソッドを使えということでしょう。
この場合の記述方法は下記のようになります。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.DateFormat;
public class SwingTest{
public static void main(String[] args){
SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateTimeInstance();
sdf.applyPattern("yyyy.MM.dd 'at' HH:mm:ss z");
System.out.println(sdf.format(new Date()));
}
}
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。