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番目のコンストラクタを見てみます。

指定されたパターンとデフォルトロケールのデフォルト日付フォーマット記号
を使って SimpleDateFormat を構築します。注: このコンストラクタはすべて
のロケールをサポートするわけではありません。すべてをカバーするには、
DateFormat クラスのファクトリメソッドを使用してください。 

パラメータ:
  pattern - 日付と時刻のフォーマットを記述するパターン 
例外: 
  NullPointerException - 指定されたパターンが null の場合 
  IllegalArgumentException - 指定されたパターンが正しくない場合

パターンの具体的な記述方法ですが、下記の規則に従って記述します。

文字日付または時刻のコンポーネント表示
G紀元テキストAD
y1996; 96
MJuly; Jul; 07
w年における週数値27
W月における週数値2
D年における日数値189
d月における日数値10
F月における曜日数値2
E曜日テキストTuesday; Tue
a午前/午後テキストPM
H1日における時 (0 ~ 23)数値0
k1日における時 (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メソッドでも指定が可能です。

指定されたパターン文字列を、この日付フォーマットに適用します。 

パラメータ:
  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 )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。