DateFormatクラス

広告

DateFormatクラスは日付または時刻をフォーマットおよび解析する、日付/時刻フォーマットサブクラスの抽象クラスです。実装クラスのSimpleDateFormatクラスも用意されており、より細かいフォーマットを指定する場合にはSimpleDateFormatクラスを使いますが、そうでない場合はDateFormatクラスを使った方がいいようです。

まず下記のクラス図を見てください。

  • java.lang.Object
  • java.text.Format
  • java.text.DateFormat
  • public abstract class DateFormat extends Format

DateFormatクラス自体はabstractクラスですが、いくつかのstaticなファクトリメソッドが用意されており、そのメソッドを使ってDateFormatクラスのオブジェクトを作成することができます。用意されているメソッドは下記の通りです。

メソッドの概要
static DateFormat getDateInstance()
デフォルトのロケールに対し、デフォルトのフォーマットスタイルを持つ日付フォーマッタを取得します。
static DateFormat getDateTimeInstance()
デフォルトのロケールに対し、デフォルトのフォーマットスタイルを持つ日付/時刻フォーマッタを取得します。
static DateFormat getInstance()
日付と時刻の両方に対し SHORT スタイルを持つ日付/時刻フォーマッタを取得します。
static DateFormat getTimeInstance()
デフォルトのロケールに対し、デフォルトのフォーマットスタイルを持つ時刻フォーマッタを取得します。

日付だけの場合はgetDateInstanceメソッドを、時刻だけの場合はgetTimeInstanceメソッドを、日付と時刻の両方を扱う場合はgetDateTimeInstanceメソッドを使います。DateFormatクラスを使って日付を文字列に変換する場合の実際の使い方は下記の様になります。

DateFormat df = DateFormat.getDateInstance();
String str = df.format(new Date());

ここで使われているformatメソッドはDateFormatクラスで下記のように定義されています。

Date を日付/時刻文字列にフォーマットします。 

パラメータ:
  date - 時刻文字列にフォーマットする時刻値 
戻り値:
  フォーマットされた時刻文字列

また先ほどのファクトリメソッドの場合、フォーマットのスタイルはデフォルトの値を使っていましたが、SHORT/MEDIUM/LONG/FULLの4つの中からフォーマットのスタイルを選択することができます。

SHORT はすべて数値で、12.13.52 や 3:30pm など
MEDIUM はそれより長い形式で、Jan 12, 1952 など
LONG はさらに長い形式で、January 12, 1952 や 3:30:32pm など
FULL はほぼ完全に指定する形式で、Tuesday, April 12, 1952 AD や 3:30:42pm PST など

フォーマットのスタイルを指定してDateFormatクラスのオブジェクトを作成する場合のファクトリメソッドもそれぞれ用意されています。

メソッドの概要
static DateFormat getDateInstance(int style)
デフォルトのロケールに対し、指定されたフォーマットスタイルを持つ日付フォーマッタを取得します。
static DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
デフォルトのロケールに対し、指定された日付/時刻フォーマットスタイルを持つ日付/時刻フォーマッタを取得します。
static DateFormat getTimeInstance(int style)
デフォルトのロケールに対し、指定されたフォーマットスタイルを持つ時刻フォーマッタを取得します。

ではここで実際にJFormattedTextFieldに適用する場合、どのような結果になるのかを試してみます。

import javax.swing.*;
import java.awt.event.*;
import java.awt.FlowLayout;

import java.text.DateFormat;
import java.util.Date;

public class SwingTest extends JFrame{
  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    DateFormat df1 = DateFormat.getDateInstance();
    JFormattedTextField ftf1 = new JFormattedTextField(df1);
    ftf1.setValue(new Date());

    DateFormat df2 = DateFormat.getDateTimeInstance();
    JFormattedTextField ftf2 = new JFormattedTextField(df2);
    ftf2.setValue(new Date());

    DateFormat df3 = DateFormat.getTimeInstance();
    JFormattedTextField ftf3 = new JFormattedTextField(df3);
    ftf3.setValue(new Date());

    JPanel p = new JPanel();
    p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
    p.add(ftf1);
    p.add(ftf2);
    p.add(ftf3);

    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(p);
  }
}

実行結果は下記のようになります。

またフォーマットスタイルを指定した場合の結果を標準出力に出力するサンプルも下記に用意しました。

import java.text.DateFormat;
import java.util.Date;

public class SwingTest{
  public static void main(String[] args){
    System.out.println("Default:");

    DateFormat df = DateFormat.getDateInstance();
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance();
    System.out.println(df.format(new Date()));

    df = DateFormat.getTimeInstance();
    System.out.println(df.format(new Date()));

    System.out.println("SHORT:");

    df = DateFormat.getDateInstance(DateFormat.SHORT);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
    System.out.println(df.format(new Date()));

    df = DateFormat.getTimeInstance(DateFormat.SHORT);
    System.out.println(df.format(new Date()));

    System.out.println("MEDIUM:");

    df = DateFormat.getDateInstance(DateFormat.MEDIUM);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
    System.out.println(df.format(new Date()));

    df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
    System.out.println(df.format(new Date()));

    System.out.println("LONG:");

    df = DateFormat.getDateInstance(DateFormat.LONG);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
    System.out.println(df.format(new Date()));

    df = DateFormat.getTimeInstance(DateFormat.LONG);
    System.out.println(df.format(new Date()));

    System.out.println("FULL:");

    df = DateFormat.getDateInstance(DateFormat.FULL);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
    System.out.println(df.format(new Date()));

    df = DateFormat.getTimeInstance(DateFormat.FULL);
    System.out.println(df.format(new Date()));
  }
}

実行結果は下記のようになります。

Default:
2005/09/06
2005/09/06 5:57:21
5:57:21

SHORT:
05/09/06
05/09/06 5:57
5:57

MEDIUM:
2005/09/06
2005/09/06 5:57:21
5:57:21

LONG:
2005/09/06
2005/09/06 5:57:21 JST
5:57:21 JST

FULL:
2005年9月6日
2005年9月6日 5時57分21秒 JST
5時57分21秒 JST

ロケールの指定

今まではロケールはデフォルトの値を使っていましたが、明示的に指定することも可能です。ロケールを指定する場合のファクトリメソッドもそれぞれ用意されています。

メソッドの概要
static DateFormat getDateInstance(int style, Locale aLocale)
指定されたロケールに対し、指定されたフォーマットスタイルを持つ日付フォーマッタを取得します。
static DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)
指定されたロケールに対し、指定されたフォーマットスタイルを持つ日付/時刻フォーマッタを取得します。
static DateFormat getTimeInstance(int style, Locale aLocale)
指定されたロケールに対し、指定されたフォーマットスタイルを持つ時刻フォーマッタを取得します。

java.util.Localeクラスについて、ここでは詳しくはみませんが、Locale オブジェクトは、特定の地理的、国家的、または文化的地域を表すためのものです。いくつかのロケールを指定して結果がどのように変わるのかを見てみます。

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class SwingTest{
  public static void main(String[] args){

    System.out.println("SHORT:");

    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, 
      DateFormat.SHORT);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.SHORT, 
      DateFormat.SHORT, Locale.US);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.SHORT, 
      DateFormat.SHORT, Locale.GERMANY);
    System.out.println(df.format(new Date()));

    System.out.println("MEDIUM:");

    df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, 
      DateFormat.MEDIUM);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, 
      DateFormat.MEDIUM, Locale.US);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, 
      DateFormat.MEDIUM, Locale.GERMANY);
    System.out.println(df.format(new Date()));

    System.out.println("LONG:");

    df = DateFormat.getDateTimeInstance(DateFormat.LONG, 
      DateFormat.LONG);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.LONG, 
      DateFormat.LONG, Locale.US);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.LONG, 
      DateFormat.LONG, Locale.GERMANY);
    System.out.println(df.format(new Date()));

    System.out.println("FULL:");

    df = DateFormat.getDateTimeInstance(DateFormat.FULL, 
      DateFormat.FULL);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.FULL, 
      DateFormat.FULL, Locale.US);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.FULL, 
      DateFormat.FULL, Locale.GERMANY);
    System.out.println(df.format(new Date()));
  }
}

実行結果は下記のようになります。

SHORT:
05/09/06 6:10
9/6/05 6:10 AM
06.09.05 06:10

MEDIUM:
2005/09/06 6:10:43
Sep 6, 2005 6:10:43 AM
06.09.2005 06:10:43

LONG:
2005/09/06 6:10:43 JST
September 6, 2005 6:10:43 AM JST
6. September 2005 06:10:43 JST

FULL:
2005年9月6日 6時10分43秒 JST
Tuesday, September 6, 2005 6:10:43 AM JST
Dienstag, 6. September 2005 6.10 Uhr JST

上記のサンプルではロケールを指定していますが、表示方法が変更になっているだけで実際の時間などは同じです。必要に応じてタイムゾーンも指定するメソッドが用意されています。

この DateFormat オブジェクトのカレンダのタイムゾーンを設定します。 

パラメータ:
  zone - 指定する新しいタイムゾーン

下記にタイムゾーンも指定した場合のサンプルを記載しておきます。

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class SwingTest{
  public static void main(String[] args){

    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
    System.out.println(df.format(new Date()));

    df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US);
    df.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
    System.out.println(df.format(new Date()));
  }
}

実行結果は下記のようになります。

2005年9月6日 6時19分23秒 JST
Monday, September 5, 2005 2:19:23 PM PDT

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)