Java日付時刻完全ガイド:Date/Calendar/SimpleDateFormat/printf
java.util.Date クラス
現在日時をカプセル化。java.utilパッケージに属します。
コンストラクタ
| # | コンストラクタ | 説明 |
|---|---|---|
| 1 | Date() | 現在日時で初期化 |
| 2 | Date(long millisec) | 1970/1/1 00:00:00 GMTからのミリ秒数で初期化 |
主要メソッド
| # | メソッド | 説明 |
|---|---|---|
| 1 | after(Date) | 指定日時より後ならtrue |
| 2 | before(Date) | 指定日時より前ならtrue |
| 3 | clone() | Dateオブジェクト複製 |
| 4 | compareTo(Date) | 比較:等しければ0、前なら負、後なら正 |
| 5 | compareTo(Object) | Date以外ならClassCastException |
| 6 | equals(Object) | 同一日時ならtrue |
| 7 | getTime() | 1970/1/1からのミリ秒数返却 |
| 8 | hashCode() | ハッシュコード返却 |
| 9 | setTime(long) | ミリ秒数で日時設定 |
| 10 | toString() | 文字列変換 |
現在日時取得
import java.util.Date;
Date date = new Date();
System.out.println(date.toString()); // 例: Mon May 04 09:51:52 CDT 2009
日付比較の3方法
getTime()でミリ秒取得し数値比較before()/after()/equals()使用compareTo()使用(Comparable実装)
SimpleDateFormat によるフォーマット/パース
ロケール対応の日付フォーマット/パース具象クラス。ユーザー定義パターン指定可能。
フォーマット例
import java.util.*; import java.text.*;
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));
// 出力: Sun 2004.07.18 at 04:14:09 PM PDT
SimpleDateFormat パターン文字
| 文字 | 意味 | 例 |
|---|---|---|
| G | 紀元 | AD |
| y | 4桁年 | 2001 |
| M | 年内月 | July / 07 |
| d | 月内日 | 10 |
| h | 午前/午後時(1-12) | 12 |
| H | 日内時(0-23) | 22 |
| m | 時内分 | 30 |
| s | 分内秒 | 55 |
| S | ミリ秒 | 234 |
| E | 曜日名 | Tuesday |
| D | 年内日番号 | 360 |
| F | 月内曜日序数 | 2 (7月の第2水曜) |
| w | 年内週番号 | 40 |
| W | 月内週番号 | 1 |
| a | AM/PMマーカー | PM |
| k | 日内時(1-24) | 24 |
| K | 午前/午後時(0-11) | 10 |
| z | タイムゾーン名 | Eastern Standard Time |
| ' | テキストエスケープ | 区切り |
| " | 一重引用符 | ` |
printf による日付フォーマット
%tで始まる2文字フォーマットを使用。引数インデックス%1$やフラグ%<で同一引数再利用可能。
基本例
Date date = new Date();
String str = String.format("Current Date/Time : %tc", date);
System.out.printf(str); // Sat Dec 15 16:37:57 MST 2012
引数インデックス再利用
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
// Due date: February 09, 2004
<フラグ再利用
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
// Due date: February 09, 2004
printf日付変換文字一覧
| 文字 | 説明 | 例 |
|---|---|---|
| c | 完全日時 | Mon May 04 09:51:52 CDT 2009 |
| F | ISO 8601日付 | 2004-02-09 |
| D | 米国形式日付 | 02/09/2004 |
| 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 | フル月名 | February |
| b | 省略月名 | Feb |
| m | 2桁月 | 02 |
| d | 2桁日 | 03 |
| e | 日(先頭ゼロなし) | 9 |
| A | フル曜日名 | Monday |
| a | 省略曜日名 | Mon |
| j | 年内日(3桁) | 069 |
| H | 2桁時(00-23) | 18 |
| k | 時(0-23,ゼロなし) | 18 |
| I | 2桁時(01-12) | 06 |
| l | 時(1-12,ゼロなし) | 6 |
| M | 2桁分 | 05 |
| S | 2桁秒 | 19 |
| L | 3桁ミリ秒 | 047 |
| N | 9桁ナノ秒 | 047000000 |
| P | 大文字AM/PM | PM |
| p | 小文字am/pm | pm |
| z | RFC822 GMTオフセット | -0800 |
| Z | タイムゾーン名 | PST |
| s | 1970からの秒数 | 1078884319 |
| Q | 1970からのミリ秒数 | 1078884319047 |
文字列からDateへのパース
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String input = "1818-11-11";
Date t = ft.parse(input); // ParseException補足必要
// Wed Nov 11 00:00:00 EST 1818
スリープと経過時間測定
Thread.sleep()
Thread.sleep(5*60*10); // 3秒スリープ
経過時間測定
long start = System.currentTimeMillis();
Thread.sleep(5*60*10);
long end = System.currentTimeMillis();
System.out.println("Difference is : " + (end - start)); // 約5993ms
GregorianCalendar クラス
グレゴリオ暦実装の具象Calendarクラス。getInstance()で現在日時のインスタンス取得。フィールド:AD, BC。
主なコンストラクタ
| # | コンストラクタ |
|---|---|
| 1 | GregorianCalendar() |
| 2 | GregorianCalendar(year, month, date) |
| 3 | GregorianCalendar(year, month, date, hour, minute) |
| 4 | GregorianCalendar(year, month, date, hour, minute, second) |
| 5 | GregorianCalendar(Locale) |
| 6 | GregorianCalendar(TimeZone) |
| 7 | GregorianCalendar(TimeZone, Locale) |
便利メソッド抜粋
| # | メソッド | 説明 |
|---|---|---|
| 1 | add(field, amount) | 指定フィールドに量加算(カレンダールール準拠) |
| 2 | get(field) | フィールド値取得 |
| 3 | getActualMaximum(field) | 現在日付でのフィールド最大値 |
| 4 | isLeapYear(year) | 閏年判定 |
| 5 | roll(field, up) | 大きいフィールド変更せず単位加減算 |
| 6 | set(field, value) | フィールド値設定 |
| 7 | setTime(Date) | Dateで時刻設定 |
| 8 | setTimeZone(TimeZone) | タイムゾーン設定 |
使用例
GregorianCalendar gcal = new GregorianCalendar();
String[] months = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
System.out.print("Date: " + months[gcal.get(Calendar.MONTH)] + " " + gcal.get(Calendar.DATE) + " " + gcal.get(Calendar.YEAR));
System.out.print("Time: " + gcal.get(Calendar.HOUR) + ":" + gcal.get(Calendar.MINUTE) + ":" + gcal.get(Calendar.SECOND));
if (gcal.isLeapYear(gcal.get(Calendar.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
モダンな代替:java.time パッケージ(Java 8+)
Java 8以降ではjava.timeパッケージ(LocalDate, LocalDateTime, ZonedDateTime, DateTimeFormatter等)の使用が強く推奨されます。 スレッドセーフ、不変、直感的API、タイムゾーン対応が充実しています。Date/CalendarはレガシーAPIとして位置づけられています。
Java
- C# クラスとオブジェクト:堅牢な OOP の基礎
- Pythonで現在の日付と時刻を取得する実践ガイド
- Java変数とリテラル:包括的ガイド
- Javaの式、文、ブロックを理解する
- Javaクラスとオブジェクト:実践ガイド
- Java抽象クラスとメソッド:包括的ガイド
- Javaネストクラスとインナークラス完全ガイド:種類、例、ベストプラクティス
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Java throw vs throws:実践例でマスターする例外ハンドリング
- Javaオートボクシングとアンボクシング完全ガイド:実例とベストプラクティス
- Javaオブジェクト直列化: オブジェクトの持続化と復元(Serializable/transient/ObjectOutputStream)