appendix> util> Date TOPUPPREVNEXT

日付と時刻

【主な機能】

日付や時刻を取り扱うためのクラスとして Date クラスがあります。 1970年1月1日午前0時(グリニッジ標準時)を基準とした、ミリ秒単位の時刻を取り扱います。

Date クラスは、コンストラクタと 日付・時刻の前後関係を判定するメソッドしか提供しません。 日付や時間に関する演算をしたり、年月日・時分秒の設定したり、 値を取得したりするには、 Calendar クラス のメソッドを使います。

Date クラスに設定したり、取り出したりする年月日・時分秒は、整数で次の範囲の値をとります。

範囲備考
 西暦
0 〜 111月 は 0 、2月 が 1、 ... 12月が 11
あるいは、Calendar.JANUARY、Calendar.FEBRUARY、... 等の定数をを使います。
1 〜 31
0 〜 23
0 〜 59
0 〜 6160 61 はうるう秒のとき

値が範囲をはずれた場合に、例外を発生させるかそれなりの解釈をするかの選択をしておくことができます。 それなりの解釈では、たとえば1月32日は2月1日になります。

日付や時刻の編集(Date から String)や、 解析 parse (String から Date) のために、 DateFormat クラス が用意されています。

日付や時刻の編集に便利な SimpleDateFormat も用意されています。 DateFormat や SimpleDateFormat がもっている 月や曜日の表示文字列を変更するには、 DateFormatSymbols クラスのメソッドを用います。

例に掲げた実行結果をざっとながめて概観をつかんでください。

【関連するクラス】

   java.lang.Object 
      ├ java.util.Date
      ├ java.text.Format
      │    └ java.text.DateFormat
      │        └ java.text.SimpleDateFormat
      ├ java.text.DateFormatSymbols
      └ java.util.Calendar
            └ java.util.GregorianCalendar

【Date クラス】

コンストラクタ機能
Date ( ) 現在の時刻を設定したインスタンスを生成します。
Date ( long m ) 1970年1月1日午前0時(グリニッジ標準時)から m ミリ秒後の時刻を設定したインスタンスを生成します。

おもなメソッド機能
boolean after ( Date when ) 自分自身が、 time より後であれば true、 そうでなければ false 。
boolean before( Date when ) 自分自身が、 when より早い場合 true 、 そうでない場合 false 。
int CompareTo ( Object obj ) obj が Date クラスでなければ ClassCastException が発生。 自分自身が obj と同時刻であれば 0 、 前であれば負の値、 後であれば正の値。
boolean equals ( Object obj ) 自分自身と obj が、ミリ秒単位で同じ時刻であれば true 、 そうでなければ false 。
long getTime ( ) 自分自身を、1970年1月1日 00:00:00.000 GMT からのミリ秒単位の経過時間変換します。

【DateFormat クラス】

編集のスタイルを指定する定数は以下のとおりです。

定数意味
SHORT できるだけ短く表現する
MEDIUM 中くらいの長さに編集する
LONG 長い形式で表現する
FULL 完全な形で表現する

日付や時刻の表現方法は、国や用いる言語によって異なります。 このように ロケール に影響されるインスタンスは、コンストラクタで新たに生成せずに、 ファクトリメソッドでインスタンスを取得します。

ファクトリメソッド返されるフォーマッタ
static DateFormat getInstance ( ) 日付と時刻ともに、SHORT スタイルの日付/時刻フォーマッタ
static DateFormat getDateTimeInstance ( ) デフォルトの日付/時刻フォーマッタ
static DateFormat getDateTimeInstance (
int date ,
int time )
datetime で日付と時刻のスタイルを指定した日付/時刻フォーマッタ
static DateFormat getDateTimeInstance (
int date ,
int time ,
Locale locale )
locale のロケール、 date の日付スタイル、 time の時刻スタイルをもつ日付/時刻フォーマッタ
static DateFormat getDateInstance ( ) デフォルトの日付フォーマッタ
static DateFormat getDateInstance ( date ) date で指定された日付スタイルの日付フォーマッタ
static DateFormat getDateInstance (
int date ,
Locale locale )
locale に指定されたロケールで、date で指定された日付スタイルの日付フォーマッタ
static DateFormat getTimeInstance ( ) デフォルトの時刻フォーマッタ
static DateFormat getTimeInstance ( time ) timeで指定された時刻スタイルの時刻フォーマッタ
static DateFormat getTimeInstance (
int time ,
Locale locale )
locale に指定されたロケールで、time で指定された時刻スタイルの時刻フォーマッタ

編集は、format メソッドでおこないます。

メソッド機能
String format ( Date date ) date を文字列に変換します。          

解析は、parse メソッドでおこないます。

メソッド機能
Date parse ( String source ) source の先頭からテキストを解析して Date に変換します。 解析できない時 ParseException がスローされます。
void setLenient ( boolean lenient ) 解析を厳密に行う場合 false 、 できるだけ好意的に解釈したい場合に true を指定します。 デフォルトは true になっています。

【例2】に編集関連のメソッドの使用例があります。 【例3】parse の使用例があります。

【SimpleDateFormat クラス】

【例4】 を参照してください。

【DateFormatSymbols クラス】

通常はコンストラクタをつかわず、ファクトリメソッドを使います。 【例5】 参照。

コンストラクタ機能
DateFormatSymbols ( ) デフォルトのロケールで生成。
DateFormatSymbols ( locale l ) ロケール l に対する DateFormatSymbols インスタンスを生成。

取得、設定に関するメソッドは以下のとおりです。

メソッド対象文字列
String[] getAmPmStrings ( )
void setAmPmStrings ( String[] ampm )
午前、午後を表現する AM や PM
String[] getEras ( )
vod setEras ( String [] eras )
紀元を表現する AD や BC
String[] getMonths ( )
void setMonths ( String [] m )
月の長い名称。 January February ...
String[] getShortMonths ( )
void setShortMonths ( String[] m )
月の短い名称。 Jan Feb ...
String[] getShortWeekdays ( )
void setShortWeekdays ( String [] w )
週の短い名称。 Sun Mon ...
String [] getWeekdays ( )
void setWeekdays ( String[] w )
週の長い名称。 Sunday Monday ...
String[] getZoneStrings ( )
void setZoneStrings ( String[] z )
タイムゾーン

【Calendar クラス】

日付や時刻を処理するための抽象クラスです。

Date クラスの値を設定したり、整数値で年月日や時分秒を設定し、 月や日を進めたり戻したり、その月の最後の日付けを調べたり、 といったことができます。 ここでは、Calendar クラスでできることを解説したのち、 実装されている子クラス GregorianCalendar のメソッドの一覧を紹介します。

カレンダは、ロケールに左右される他のクラスと同様、 ファクトリメソッドで取得します。 取得したカレンダは、現在の時刻で初期化されています。

フィールドと設定可能な値

フィールド値定数意味
ERA ユリウス暦の年代。 AD BC
YEAR 年。
MONTH 月。
JANUARY MONTH フィールドの値。最初の月を表現。
FEBRUARY MONTH フィールドの値。2番目の月。
MARCH MONTH フィールドの値。3番目の月。
APRIL MONTH フィールドの値。4番目の月。
MAY MONTH フィールドの値。5番目の月。
JUNE MONTH フィールドの値。6番目の月。
JULY MONTH フィールドの値。7番目の月。
AUGUST MONTH フィールドの値。8番目の月。
SEPTEMBER MONTH フィールドの値。9番目の月。
OCTOBER MONTH フィールドの値。10番目の月。
NOVEMBER MONTH フィールドの値。11番目の月。
DECEMBER MONTH フィールドの値。12番目の月。
UNDECIMBER MONTH フィールドの値。13番目の月。
WEEK_OF_YEAR 年の何週目か。
WEEK_OF_MONTH 月の何週目か。
DAY_OF_YEAR 年の何日目か。
DAY_OF_MONTH 月の何日目か。
DATE 月の何日目か。
DAY_OF_WEEK 曜日。
SUNDAY DAY_OF_WEEK の値。 日曜日。
MONDAY DAY_OF_WEEK の値。 月曜日。
TUESDAY DAY_OF_WEEK の値。 火曜日。
WEDNESDAY DAY_OF_WEEK の値。 水曜日。
THERSDAY DAY_OF_WEEK の値。 木曜日。
FRIDAY DAY_OF_WEEK の値。 金曜日。
SATURDAY DAY_OF_WEEK の値。 土曜日。
DAY_OF_WEEK_IN_MONTH 当月の何度目の曜日か。
AM_PM 午前か午後か。
AM AM_PM の値。 午前。
PM AM_PM の値。 午前。
HOUR_OF_DAY 24時間制の時刻。
HOUR 12時間制の時刻。
MINUTE 分。
SECOND 秒。
MILLISECOND ミリ秒。
ZONE_OFFSET GMTからのずれ。 ミリ秒単位。
DST_OFFSET 夏時間のオフセット。 ミリ秒単位。

ファクトリメソッド

メソッド取得する Calendar
static Calendar getInstance ( ) デフォルトを取得。
static Calendar getInstance ( Locale l ) ロケール l の Calendar
static Calendar getInstance ( TimeZone t ) タイムゾーン t の Calendar
static Calendar getInstance (
TimeZone t ,
Locale l )
指定されたロケールとタイムゾーンの Calendar

カレンダを設定するメソッド

フィールドに値を設定した場合、 その都度全フィールドを再計算することはしません。 値を取り出す前に、各フィールドを好きな順に設定することができます。
メソッド機能
void clear ( ) すべてのフィールドをクリアします。
void clear ( int f ) f で指定されたフィールドをクリアします。
void set ( int f , int v ) f で指定されたフィールドに 値 v を設定します。
void set ( int y , int m , int d ) 年、月、日 を設定します。
void set (
int y , int m , int d ,
int h , int mt )
年、月、日、時、分 を設定します。
void set (
int y , int m , int d ,
int h , int mt , int s )
年、月、日、時、分、秒 を設定します。
void setTime ( Date date ) カレンダに日付と時刻 date を設定します。
void setTimeInMillis ( long m ) カレンダに ミリ秒 m で表された日付と時刻を設定します。
void setFirstDayOfWeek ( int day ) 週の最初を何曜日にするかを設定します。
void setLenient ( boolean b ) フィールドの値の範囲を厳密にあつかうかどうかを指定します。 フィールドの値が範囲を超えた場合に例外を発生させたければ、 bfalse にします。 b を true に設定したカレンダでは、、 たとえば1996年2月942日は、 1996年2月1日から第941日目と解釈されます。
void setMinimalDaysInFirstWeek ( int value ) 年の最初の週に必要な最小日数を設定します。
void setTimeZone ( TimeZone t ) タイムゾーンを t にします。

カレンダから値を取り出すメソッド

カレンダから値を取り出す前に、全てのフィールドが再計算されます。 各フィールドの値は定められた範囲におさまっています。
メソッド取得される値
int get ( int f ) f フィールドの値。
Date getTime ( ) 設定されている日時を Date で表現した値。
int getActualMaximun ( int f ) 設定されている日付に対して、フィールド f が 持ち得る最大値。
int getActualMinimun ( int f ) 設定されている日付に対して、フィールド f が 持ち得る最小値。
static Locale[] getAvailableLocales ( ) カレンダがつかえるロケールのリスト。
int getFirstDayOfWeek ( ) 週の最初の曜日。
int getMinimalDaysInFirstWeek ( ) 年の最初の週に必要な最小日数。
TimeZone getTimeZone ( ) このカレンダのタイムゾーン。
abstract
int getGratestMinimum ( int f )
フィールド f の最小値の上限。 最小値が変化しない場合は、getMinimum ( ) と同じ値。
abstract
int getLeastMaximun ( )
フィールド f の最大値の下限。
abstract
int getMaximum ( int f )
フィールド f の最大値。
abstract
int getMinimum ( int f )
フィールド f の最小値。

値を操作するメソッド

メソッド機能
abstract
void add ( int f , int v )
フィールド f に (符号付の)値 v を加え、 全フィールドの再評価をします。 つまり上位のフィールドに繰り上がる(増えたり減ったりする)可能性があります。 また日付が月末に近い時に月を進めたり戻したりする場合には注意が必要です。 たとえば日付が31日のときに、 小の月に移動させると日がその月の最終日に移動します。 29〜30日のとき、うるう年でない2月に移動しても同じです。
月を get して同じ月数を加えて set すると、翌月の1日(2月ならば、 3月2日か3日)になります。
void roll ( int f , boolean up ) up が true ならば、フィールド f の値を1つ増やし、 そうでなければ 1 減らします。上位のフィールドは変化しません。 そのフィールドの値の範囲を上に超えたら最小値にもどり、 範囲を下にはずれたら最大値に戻ります。 日付が31日のときに月を roll して小の月になると、 日付けは30日になります。さらに大の月に roll しても30日のままです。
void roll ( int f , int n ) フィールド fn 回 roll する。 (という定義になっていますが、 月末日付で2月をまたがっても28日になったりはしません)

暦日の処理はやっかいな問題を含んでいます。実際の業務で Javaのカレンダ機能をどこまでうまく使えるか、もうすこし調査が必要です。

【例1】 Date クラス

現在時刻を取得して、toString メソッドで文字列に変換し表示してみましょう。

ソース・プログラム DateSample1.java

実行結果  DateSample1-1.gif

Date クラスの変数 now に 日付や時刻に関する情報が入っていることが判ります。

【例2】  DateFormat クラス format

日付や時刻の表示は、言語や国によってさまざまです。言語や国を識別するために、 Locale クラス が用意されています。国( Locale.JAPAN 、Locale.US 、Locale.UK など)や 言語( Locale.JAPANESE 、 Locale.ENGLISH など)を指定して表現形式を選択します。 さらに 各ロケールに対して SHORT、 MEDIUM、 LONG、 FULL の4種類を選択できます。 さらに、日付だけ、時刻だけ、日付と時刻の3種類の編集があります。

現在時刻を次の12種類の書式で編集してみました。

ロケールなしSHORT形式日付のみ
ロケールなしSHORT形式時刻のみ
ロケールなしSHORT形式日付と時刻
ロケールなしMEDIUM形式日付と時刻
ロケールなしLONG形式日付と時刻
ロケールなしFULL形式日付と時刻
ロケール 英語FULL形式日付と時刻
ロケール 英国FULL形式日付と時刻
ロケール 米国FULL形式日付と時刻
ロケール フランス語FULL形式日付と時刻
ロケール ドイツ語FULL形式日付と時刻
ロケール イタリア語FULL形式日付と時刻

ソース・プログラム DateSample2.java

実行結果  DateSample2-1.gif

【例3】  DateFormat クラス parse

コマンドラインに指定した日付を Date に変換します。

ソース・プログラム DateSample2Scan.java

実行結果  DateSample2Scan-1.gif

【例4】 SimpleDateFormat クラス

日付と時刻をユーザ定義パターンで編集するためのクラスです。 パターン文字の定義は次のとおりです。
文字意味表示
G紀元(テキスト)
y(数値)
M(テキストか数値)
d(数値)
h時 (1 〜 12)(数値)
K時 (0 〜 11)(数値)
k時 (1 〜 24)(数値)
H時 (0 〜 23)(数値)
m(数値)
s(数値)
Sミリ秒(数値)
E曜日(テキスト)
a午前/午後(テキスト)
zタイムゾーン(テキスト)

パターン文字の文字数によって、そのフォーマットが決まります。

(テキスト)
4以上 - FULL形式を使用します。
4未満 - 短い形式または省略された形式があれば、それを使用します。
(数値)
最小桁数。これより短い数値は、この桁数までゼロが追加されます。
年には特別な処理があります。 つまり、'yy' であれば、年は 2 桁に短縮されます。
(テキストか数値)
3 以上の場合はテキストを、そうでない場合は数値を使用します。

パターンの文字が a〜z あるいは A〜Z でない場合は、そのまま編集されます。 アポストロフィ(')でくくられた文字もそのまま埋め込まれて編集されます。 アポストロフィ自体を挿入したいときは、アポストロフィを2個つづけて書きます。

ソース・プログラム DateSample3.java

実行結果  DateSample3-1.gif

【例5】 DateFormatSymbols クラス

ソース・プログラム DateSample4.java

実行結果  DateSample4-1.gif

       DateSample4-2.gif

【例6】 Calendar クラス

ソース・プログラム DateSample6.java

実行結果  DateSample6-1.gif

【例7】 経過時間の測定

Date で現在時刻を取得し差を計算します。 Date がミリ秒単位ですので、時間・分・秒および小数点以下3桁で表示しましょう。 CPUを無駄遣いする部分は、コマンドラインに与えた数値以下の素数がいくつあるかを 数えています。

ソース・プログラム DateSample7.java

実行結果  DateSample7-1.gif

一定時間ごとに表示を更新するような場合は、タイマ を利用します。


更新日:2006-01-22