Java - 日付と時刻
Java は Date を提供します java.util で利用可能なクラス パッケージの場合、このクラスは現在の日付と時刻をカプセル化します。
Date クラスは、次の表に示すように 2 つのコンストラクターをサポートしています。
| Sr.No. | コンストラクターと説明 |
|---|---|
| 1 | 日付( ) このコンストラクターは、現在の日付と時刻でオブジェクトを初期化します。 |
| 2 | 日付 (長いミリ秒) このコンストラクターは、1970 年 1 月 1 日の午前 0 時から経過したミリ秒数に等しい引数を受け入れます。 |
以下は日付クラスのメソッドです。
| Sr.No. | 方法と説明 |
|---|---|
| 1 | boolean after(Date date) 呼び出し元の Date オブジェクトに日付で指定された日付より後の日付が含まれている場合は true を返し、そうでない場合は false を返します。 |
| 2 | boolean before(Date date) 呼び出し元の Date オブジェクトに date で指定された日付より前の日付が含まれている場合は true を返し、そうでない場合は false を返します。 |
| 3 | オブジェクト クローン( ) 呼び出し元の Date オブジェクトを複製します。 |
| 4 | int compareTo(Date date) 呼び出しオブジェクトの値を日付の値と比較します。値が等しい場合は 0 を返します。呼び出し元のオブジェクトが日付より前の場合、負の値を返します。呼び出し元のオブジェクトが日付より後の場合、正の値を返します。 |
| 5 | int compareTo(オブジェクト obj) obj がクラス Date の場合、compareTo(Date) と同じように動作します。それ以外の場合は、ClassCastException をスローします。 |
| 6 | boolean equals(オブジェクトの日付) 呼び出し元の Date オブジェクトが date で指定されたものと同じ時刻と日付を含む場合は true を返し、そうでない場合は false を返します。 |
| 7 | 長い getTime( ) 1970 年 1 月 1 日から経過したミリ秒数を返します。 |
| 8 | int hashCode( ) 呼び出しオブジェクトのハッシュ コードを返します。 |
| 9 | void setTime(長時間) 1970 年 1 月 1 日の午前 0 時からの経過時間をミリ秒単位で表す time で指定された時刻と日付を設定します。 |
| 10 | 文字列 toString( ) 呼び出し元の Date オブジェクトを文字列に変換し、結果を返します。 |
現在の日付と時刻を取得する
これは、Java で現在の日付と時刻を取得するための非常に簡単な方法です。 toString() で単純な Date オブジェクトを使用できます 次のように現在の日付と時刻を出力するメソッド-
例
ライブデモ
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date using toString()
System.out.println(date.toString());
}
}
これにより、次の結果が生成されます-
出力
on May 04 09:51:52 CDT 2009
日付比較
以下は、2 つの日付を比較する 3 つの方法です −
- <リ>
getTime( ) を使用して、1970 年 1 月 1 日の午前 0 時から経過したミリ秒数を両方のオブジェクトについて取得し、これら 2 つの値を比較できます。
<リ>メソッド before( )、after( )、および equals( ) を使用できます。たとえば、月の 12 日は 18 日より前に来るため、new Date(99, 2, 12).before(new Date (99, 2, 18)) は true を返します。
<リ>Comparable インターフェイスによって定義され、Date によって実装される compareTo( ) メソッドを使用できます。
SimpleDateFormat を使用した日付の書式設定
SimpleDateFormat は、ロケールに依存した方法で日付をフォーマットおよび解析するための具象クラスです。 SimpleDateFormat を使用すると、日時の書式設定にユーザー定義のパターンを選択することから始めることができます。
例
ライブデモ
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date( );
SimpleDateFormat ft =
new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
これにより、次の結果が生成されます-
出力
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
単純な DateFormat フォーマット コード
時間形式を指定するには、時間パターン文字列を使用します。このパターンでは、すべての ASCII 文字がパターン文字として予約されており、次のように定義されています −
| キャラクター | 説明 | 例 |
|---|---|---|
| G | 年号指定子 | 西暦 |
| y | 4 桁の年 | 2001 |
| M | 月 | 7 月または 7 日 |
| d | 日 | 10 |
| 時間 | 午前/午後の時間(1~12) | 12 |
| H | 時間 (0~23) | 22 |
| 分 | 分単位 | 30 |
| 秒 | 55 | |
| S | ミリ秒 | 234 |
| 日 | 曜日 | 火曜日 |
| D | 年間通算日 | 360 |
| F | 月の曜日 | 2 (7 月の第 2 水曜日) |
| w | 年の週 | 40 |
| 西 | 月の週 | 1 |
| a | 午前/午後マーカー | 午後 |
| k | 時間 (1~24) | 24 |
| K | 午前/午後の時間(0~11) | 10 |
| z | タイムゾーン | 東部標準時 |
| ' | テキストのエスケープ | 区切り文字 |
| " | 一重引用符 | ` |
printf を使用した日付の書式設定
日付と時刻のフォーマットは printf を使用して非常に簡単に行うことができます 方法。 t で始まる 2 文字の形式を使用しています 次のコードに示すように、表の文字の 1 つで終わります。
例
ライブデモ
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
String str = String.format("Current Date/Time : %tc", date );
System.out.printf(str);
}
}
これにより、次の結果が生成されます-
出力
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
各部分をフォーマットするために日付を複数回指定する必要があるとしたら、少しばかげています。そのため、フォーマット文字列は、フォーマットされる引数のインデックスを示すことができます。
インデックスは % の直後に続き、$ で終了する必要があります。
例
ライブデモ
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
}
}
これにより、次の結果が生成されます-
出力
Due date: February 09, 2004
または、<フラグを使用できます。前述のフォーマット仕様と同じ引数を再度使用する必要があることを示します。
例
ライブデモ
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display formatted date
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
}
}
これにより、次の結果が生成されます-
出力
Due date: February 09, 2004
日付と時刻の変換文字
| キャラクター | 説明 | 例 |
|---|---|---|
| c | 完全な日付と時刻 | Mon May 04 09:51:52 CDT 2009 |
| F | ISO 8601 日付 | 2004-02-09 |
| D | 米国フォーマットされた日付 (月/日/年) | 2004/02/09 |
| T | 24時間制 | 18:05:19 |
| r | 12時間制 | 06:05:19 pm |
| R | 秒なしの 24 時間制 | 18:05 |
| Y | 4 桁の年 (先行ゼロ付き) | 2004 |
| y | 西暦の下 2 桁 (先行ゼロ付き) | 04 |
| C | 年の上 2 桁 (先行ゼロ付き) | 20 |
| B | 完全な月の名前 | 2月 |
| b | 月の略称 | 2月 |
| 分 | 2 桁の月 (先行ゼロ付き) | 02 |
| d | 2 桁の日 (先行ゼロ付き) | 03 |
| え | 2 桁の日 (先行ゼロなし) | 9 |
| あ | 完全な曜日名 | 月曜日 |
| a | 曜日の略称 | 月 |
| j | 3 桁の日 (先行ゼロ付き) | 069 |
| H | 00 から 23 までの 2 桁の時間 (先行ゼロ付き) | 18 |
| k | 0 から 23 までの 2 桁の時間 (先行ゼロなし) | 18 |
| 私 | 01 から 12 までの 2 桁の時間 (先行ゼロ付き) | 06 |
| l | 1 から 12 までの 2 桁の時間 (先行ゼロなし) | 6 |
| M | 2 桁の分 (先行ゼロ付き) | 05 |
| S | 2 桁の秒 (先行ゼロ付き) | 19 |
| L | 3 桁のミリ秒 (先行ゼロ付き) | 047 |
| N | 9 桁のナノ秒 (先行ゼロ付き) | 047000000 |
| P | 大文字の午前または午後のマーカー | 午後 |
| p | 小文字の午前または午後のマーカー | 午後 |
| z | GMT からの RFC 822 数値オフセット | -0800 |
| Z | タイムゾーン | PST |
| s | 1970-01-01 00:00:00 GMT からの秒数 | 1078884319 |
| Q | 1970-01-01 00:00:00 GMT からのミリ秒 | 1078884319047 |
日付と時刻に関連する他の便利なクラスがあります。詳細については、Java 標準のドキュメントを参照してください。
文字列を日付に解析する
SimpleDateFormat クラスにはいくつかの追加メソッドがあり、特に parse( ) は、指定された SimpleDateFormat オブジェクトに格納されている形式に従って文字列を解析しようとします。
例
ライブデモ
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
上記のプログラムのサンプル実行は、次の結果を生成します −
出力
1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818
しばらく眠る
1 ミリ秒からコンピューターの寿命まで、任意の期間スリープできます。たとえば、次のプログラムは 3 秒間スリープします −
例
ライブデモ
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
これにより、次の結果が生成されます-
出力
Sun May 03 18:04:41 GMT 2009 Sun May 03 18:04:51 GMT 2009
経過時間の測定
場合によっては、特定の時点をミリ秒単位で測定する必要がある場合があります。上記の例をもう一度書き直してみましょう −
例
ライブデモ
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
これにより、次の結果が生成されます-
出力
Sun May 03 18:16:51 GMT 2009 Sun May 03 18:16:57 GMT 2009 Difference is : 5993
GregorianCalendar クラス
GregorianCalendar は、使い慣れた通常のグレゴリオ暦を実装する Calendar クラスの具体的な実装です。このチュートリアルでは Calendar クラスについては説明しませんでした。これについては、標準の Java ドキュメントを参照してください。
getInstance( ) Calendar のメソッドは、デフォルトのロケールとタイム ゾーンの現在の日付と時刻で初期化された GregorianCalendar を返します。 GregorianCalendar は、AD と BC の 2 つのフィールドを定義します。これらは、グレゴリオ暦で定義された 2 つの時代を表しています。
GregorianCalendar オブジェクトのコンストラクタもいくつかあります −
| Sr.No. | コンストラクターと説明 |
|---|---|
| 1 | GregorianCalendar() デフォルト タイム ゾーンの現在の時刻とデフォルト ロケールを使用して、デフォルトの GregorianCalendar を構築します。 |
| 2 | GregorianCalendar(int year, int month, int date) デフォルト ロケールのデフォルト タイム ゾーンで指定された日付が設定された GregorianCalendar を構築します。 |
| 3 | GregorianCalendar(int year, int month, int date, int hour, int minutes) デフォルト ロケールのデフォルト タイム ゾーンに設定された、指定された日時で GregorianCalendar を構築します。 |
| 4 | GregorianCalendar(int year, int month, int date, int hour, int minutes, int second) デフォルト ロケールのデフォルト タイム ゾーンに設定された、指定された日時で GregorianCalendar を構築します。 |
| 5 | GregorianCalendar(Locale aLocale) 指定されたロケールのデフォルト タイム ゾーンの現在の時刻に基づいて GregorianCalendar を構築します。 |
| 6 | グレゴリオ暦 (タイムゾーン) デフォルトのロケールを使用して、指定されたタイム ゾーンの現在の時刻に基づいて GregorianCalendar を構築します。 |
| 7 | GregorianCalendar(TimeZone ゾーン、Locale aLocale) 指定されたロケールの指定されたタイム ゾーンの現在の時刻に基づいて GregorianCalendar を構築します。 |
GregorianCalendar クラスによって提供されるいくつかの便利なサポート メソッドのリストを次に示します −
| Sr.No. | 方法と説明 |
|---|---|
| 1 | void add(int field, int amount) カレンダーのルールに基づいて、指定された (署名された) 時間を指定された時間フィールドに追加します。 |
| 2 | 保護された void computeFields() UTC をミリ秒単位で時間フィールド値に変換します。 |
| 3 | 保護された void computeTime() Calendar をオーバーライドします。時間フィールドの値をミリ秒単位で UTC に変換します。 |
| 4 | boolean equals(Object obj) この GregorianCalendar をオブジェクト参照と比較します。 |
| 5 | int get(int フィールド) 指定された時間フィールドの値を取得します。 |
| 6 | int getActualMaximum(int フィールド) 現在の日付で、このフィールドが取りうる最大値を返します。 |
| 7 | int getActualMinimum(int フィールド) 現在の日付が与えられた場合に、このフィールドが持つことができる最小値を返します。 |
| 8 | int getGreatestMinimum(int フィールド) 異なる場合、指定されたフィールドの最大最小値を返します。 |
| 9 | 日付 getGregorianChange() グレゴリオ暦の変更日を取得します。 |
| 10 | int getLeastMaximum(int フィールド) 異なる場合、指定されたフィールドの最小最大値を返します。 |
| 11 | int getMaximum(int フィールド) 指定されたフィールドの最大値を返します。 |
| 12 | 日付 getTime() このカレンダーの現在の時刻を取得します。 |
| 13 | 長い getTimeInMillis() このカレンダーの現在の時刻を long として取得します。 |
| 14 | タイムゾーン getTimeZone() タイムゾーンを取得します。 |
| 15 | int getMinimum(int フィールド) 指定されたフィールドの最小値を返します。 |
| 16 | int hashCode() hashCode をオーバーライドします。 |
| 17 | boolean isLeapYear(int year) 指定された年がうるう年かどうかを判断します。 |
| 18 | void ロール (int フィールド、boolean up) 大きなフィールドを変更せずに、指定された時間フィールドで単一の時間単位を加算または減算 (アップ/ダウン) します。 |
| 19 | void set(int フィールド, int 値) 指定された値で時間フィールドを設定します。 |
| 20 | void set(int year, int month, int date) 年、月、日のフィールドの値を設定します。 |
| 21 | void set(int year, int month, int date, int hour, int minutes) 年、月、日、時、分フィールドの値を設定します。 |
| 22 | void set(int year, int month, int date, int hour, int minutes, int second) 年、月、日、時、分、秒のフィールドの値を設定します。 |
| 23 | void setGregorianChange(Date date) GregorianCalendar の変更日を設定します。 |
| 24 | void setTime(Date date) 指定された日付でこのカレンダーの現在の時刻を設定します。 |
| 25 | void setTimeInMillis(ロング ミリ秒) 指定された long 値からこのカレンダーの現在の時刻を設定します。 |
| 26 | void setTimeZone(TimeZone 値) 指定されたタイム ゾーン値でタイム ゾーンを設定します。 |
| 27 | 文字列 toString() このカレンダーの文字列表現を返します。 |
例
ライブデモ
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"};
int year;
// Create a Gregorian calendar initialized
// with the current date and time in the
// default locale and timezone.
GregorianCalendar gcalendar = new GregorianCalendar();
// Display current time and date information.
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// Test if the current year is a leap year
if(gcalendar.isLeapYear(year)) {
System.out.println("The current year is a leap year");
}else {
System.out.println("The current year is not a leap year");
}
}
}
これにより、次の結果が生成されます-
出力
Date: Apr 22 2009 Time: 11:25:27 The current year is not a leap year
Calendar クラスで使用できる定数の完全なリストについては、標準の Java ドキュメントを参照してください。
Java