Java 日付と時刻
Java には複数の日付時刻 API が用意されています。以下は主要なカテゴリの比較と一般的なメソッドのまとめです。
| カテゴリ | 主要クラス | スレッドセーフ | 可変性 | Java バージョン | 特徴 |
|---|---|---|---|---|---|
| 従来の日付 | Date, Calendar,GregorianCalendar | 否 | 可変 | 1.0+ | 設計上の欠陥が多く、推奨されません |
| 新しい日付時刻 | LocalDate, LocalTime, LocalDateTime, ZonedDateTime, ChronoUnit | である | 不変 | 8+ | 設計が良好で、推奨されます |
| タイムスタンプ | Instant | である | 不変 | 8+ | マシン時間で、ナノ秒まで正確 |
| フォーマット | DateTimeFormatter | である | 不変 | 8+ | スレッドセーフなフォーマットクラス |
LocalDate/DateTimeFormatter
LocalDate/DateTimeFormatter は Java 8 で導入された日付クラスです。LocalDate は時刻を含まない日付(年-月-日)を表すために使用され、DateTimeFormatter は日付時刻オブジェクトのフォーマットと解析に使用されます。
例
import java.time.format.DateTimeFormatter;
public class サンプルTest {
public static void main(String[] args) {
// 現在の日付を取得
LocalDate today = LocalDate.now();
System.out.println(現在の日付: + today);
// 特定の日付を作成
LocalDate nationalDay = LocalDate.of(2025, 10, 1);
System.out.println("国慶節: " + nationalDay);
// 日付の加算と減算
LocalDate tomorrow = today.plusDays(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate lastYear = today.minusYears(1);
System.out.println("明日: " + tomorrow);
System.out.println("来月: " + nextMonth);
System.out.println("去年の今日: " + lastYear);
}
}
上記の例の出力結果は次のとおりです。
当前日期: 2025-05-01 国庆节: 2025-10-01 明天: 2025-05-02 下个月: 2025-06-01 去年今天: 2024-05-01
-
新しいプロジェクトでは java.time パッケージを優先的に使用します (Java 8+)
-
古い Date クラスと Calendar クラスの使用は避けます
-
タイムゾーンの使用を明確に区別します:
-
タイムゾーン不要:LocalDate/LocalTime/LocalDateTime
-
タイムゾーン必要:ZonedDateTime
-
-
フォーマット時はスレッドセーフを考慮します:SimpleDateFormat ではなく DateTimeFormatter を使用
-
データベース連携:
-
JDBC 4.2+ は java.time タイプを直接サポート
-
旧バージョンでは java.sql.Date/Timestamp に変換可能
-
1. LocalDate (日付)
例
LocalDate date = LocalDate.of(2023, Month.JUNE, 15);
int year = date.getYear(); // 2023
Month month = date.getMonth(); // JUNE
int day = date.getDayOfMonth(); // 15
LocalDate nextWeek = today.plusWeeks(1);
boolean isLeap = date.isLeapYear(); // うるう年かどうか
2. LocalTime (時刻)
例
LocalTime time = LocalTime.of(14, 30, 45); // 14:30:45
int hour = time.getHour(); // 14
int minute = time.getMinute(); // 30
LocalTime nextHour = time.plusHours(1);
3. LocalDateTime (日付時刻)
例
LocalDateTime dt = LocalDateTime.of(2023, 6, 15, 14, 30);
LocalDateTime nextMonth = dt.plusMonths(1);
4. ZonedDateTime (タイムゾーン付き日付時刻)
例
ZonedDateTime nyTime = zdt.withZoneSameInstant(ZoneId.of("America/New_York"));
ZoneId zone = zdt.getZone(); // タイムゾーンを取得
5. Instant (タイムスタンプ)
例
Instant later = now.plusSeconds(60); // 60秒後
long epochMilli = now.toEpochMilli(); // ミリ秒のタイムスタンプを取得
Date クラス
java.util パッケージは、現在の日付と時刻をカプセル化する Date クラスを提供します。Date クラスは、Date オブジェクトをインスタンス化するための 2 つのコンストラクタを提供します。
最初のコンストラクタは、現在の日付と時刻を使用してオブジェクトを初期化します。
2 番目のコンストラクタは、1970 年 1 月 1 日からのミリ秒数であるパラメータを 1 つ受け取ります。
Date オブジェクトを作成した後、以下のメソッドを呼び出すことができます。
| 番号 | メソッドと説明 |
|---|---|
| 1 |
boolean after(Date date) このメソッドを呼び出す Date オブジェクトが指定された日付より後にある場合に true を返し、それ以外の場合は false を返します。 |
| 2 |
boolean before(Date date) このメソッドを呼び出す Date オブジェクトが指定された日付より前にある場合に true を返し、それ以外の場合は false を返します。 |
| 3 |
Object clone( ) このオブジェクトのコピーを返します。 |
| 4 |
int compareTo(Date date) このメソッドを呼び出す Date オブジェクトと指定された日付を比較します。両者が等しい場合は 0 を返します。呼び出しオブジェクトが指定された日付より前の場合は負の数を返し、後の場合は正の数を返します。 |
| 5 |
int compareTo(Object obj) obj が Date 型の場合、操作は compareTo(Date) と同じです。それ以外の場合は ClassCastException をスローします。 |
| 6 |
boolean equals(Object date) このメソッドを呼び出す Date オブジェクトと指定された日付が等しい場合は true を返し、それ以外の場合は false を返します。 |
| 7 |
long getTime( ) 1970 年 1 月 1 日 00:00:00 GMT 以降の、この Date オブジェクトが表すミリ秒数を返します。 |
| 8 |
int hashCode( ) このオブジェクトのハッシュコード値を返します。 |
| 9 |
void setTime(long time) 1970 年 1 月 1 日 00:00:00 GMT から time ミリ秒後の時刻と日付を設定します。 |
| 10 |
String toString( ) この Date オブジェクトを次の形式の String に変換します:dow mon dd hh:mm:ss zzz yyyy ここで、dow は曜日 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) です。 |
現在の日付時刻を取得
Java で現在の日付と時刻を取得するのは簡単です。Date オブジェクトの toString() メソッドを使用して現在の日付と時刻を出力します。次のようになります:
例
上記の例をコンパイルして実行した結果は次のとおりです:
Mon May 04 09:51:52 CDT 2013
日付の比較
Java では、2 つの日付を比較するために次の 3 つのメソッドを使用します:
- getTime() メソッドを使用して 2 つの日付の値を取得し(1970 年 1 月 1 日からの経過ミリ秒数)、その後 2 つの値を比較します。
- before()、after() および equals() メソッドを使用します。たとえば、月の 12 日は 18 日より早いので、new Date(99, 2, 12).before(new Date (99, 2, 18))true を返します。
- compareTo() メソッドを使用します。これは Comparable インターフェースで定義されており、Date クラスはこのインターフェースを実装しています。
1. getTime() メソッドを使用した比較
この方法では、日付オブジェクトが 1970 年 1 月 1 日(Unix エポック)からの経過ミリ秒数を比較します。
例
public class DateComparison {
public static void main(String[] args) {
Date date1 = new Date(121, 5, 15); // 2021年6月15日
Date date2 = new Date(121, 5, 20); // 2021年6月20日
// ミリ秒を比較
if (date1.getTime() < date2.getTime()) {
System.out.println("date1 は date2 より前");
} else if (date1.getTime() > date2.getTime()) {
System.out.println("date1 は date2 より後");
} else {
System.out.println("2 つの日付は同じ");
}
}
}
出力:
date1 在 date2 之前
2. before(), after() および equals() メソッドの使用
これらのメソッドは Date クラスに組み込まれた比較メソッドであり、意味がより明確です。
例
public class DateComparison {
public static void main(String[] args) {
Date date1 = new Date(121, 5, 15); // 2021年6月15日
Date date2 = new Date(121, 5, 20); // 2021年6月20日
// before() メソッドを使用
System.out.println("date1 は date2 より前ですか? " + date1.before(date2));
// after() メソッドを使用
System.out.println("date1 は date2 より後ですか? " + date1.after(date2));
// equals() メソッドを使用
System.out.println("2 つの日付は同じですか? " + date1.equals(date2));
}
}
出力:
date1 在 date2 之前吗? true date1 在 date2 之后吗? false 两个日期相同吗? false
3. compareTo() メソッドの使用
Date クラスは Comparable インターフェースを実装しており、compareTo() メソッドを使用して比較できます。
例
public class DateComparison {
public static void main(String[] args) {
Date date1 = new Date(121, 5, 15); // 2021年6月15日
Date date2 = new Date(121, 5, 20); // 2021年6月20日
int result = date1.compareTo(date2);
if (result < 0) {
System.out.println("date1 は date2 より前");
} else if (result > 0) {
System.out.println("date1 は date2 より後");
} else {
System.out.println("2つの日付は同じ");
}
}
}
出力:
date1 在 date2 之前
SimpleDateFormat を使用した日付のフォーマット
SimpleDateFormat は、ロケールに依存する方法で日付をフォーマットおよび解析するクラスです。SimpleDateFormat を使用すると、任意のユーザー定義の日時形式を選択できます。例:
例
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
このコード行は変換の形式を定義しています。ここで、yyyy は西暦の年、MM は月、dd は日、HH:mm:ss は時、分、秒です。
注意:大文字の形式もあれば小文字の形式もあります。例えば、MM は月、mm は分、HH は24時間制、hh は12時間制です。
上記の例をコンパイルして実行した結果は次のとおりです:
当前时间为: 2018-09-06 10:16:34
日付と時刻のフォーマットコード
時間パターン文字列は、時刻形式を指定するために使用されます。このパターンでは、すべてのASCII文字がパターン文字として予約されており、次のように定義されています:
| 文字 | 説明 | 例 |
|---|---|---|
| G | 紀元マーカー | AD |
| y | 4桁の年 | 2001 |
| M | 月 | July or 07 |
| d | 月の日 | 10 |
| h | A.M./P.M. (1~12) 形式の時 | 12 |
| H | 1日の時間 (0~23) | 22 |
| m | 分 | 30 |
| s | 秒 | 55 |
| S | ミリ秒 | 234 |
| E | 曜日 | Tuesday |
| D | 年の日 | 360 |
| F | 月の何週目の曜日 | 2 (second Wed. in July) |
| w | 年の週 | 40 |
| W | 月の週 | 1 |
| a | A.M./P.M. マーカー | PM |
| k | 1日の時間 (1~24) | 24 |
| K | A.M./P.M. (0~11) 形式の時 | 10 |
| z | タイムゾーン | Eastern Standard Time |
| ' | 文字区切り文字 | Delimiter |
| " | 一重引用符 | ` |
printfを使用した日付のフォーマット
printf メソッドは、時刻と日付を簡単にフォーマットできます。2文字の形式を使用し、それは%tで始まり、次の表のいずれかの文字で終わります。
- %tY:4桁の年を出力します。例:2023
- %ty:2桁の年を出力します。例:23
- %tm:2桁の月を出力します。例:02
- %tB:月のフルネームを出力します。例:February
- %tb:月の省略名を出力します。例:Feb
- %tA:曜日のフルネームを出力します。例:Wednesday
- %ta:曜日の省略名を出力します。例:Wed
- %td:2桁の日を出力します。例:24
- %te:1桁または2桁の日を出力します。例:24 または 02
- %tH:24時間制の時を出力します。例:23
- %tI:12時間制の時を出力します。例:11
- %tM:分を出力します。例:45
- %tS:秒を出力します。例:30
- %tp:午前か午後かを出力します。例:AM または PM
- %tZ:タイムゾーンを出力します。例:GMT+08:00
|
変換文字 |
説明 |
例 |
|---|---|---|
|
%tc |
すべての日付と時刻情報を含む |
土曜日 10月 27 14:21:20 CST 2007 |
|
%tF |
「年-月-日」形式 |
2007-10-27 |
|
%tD |
"月/日/年"形式 |
10/27/07 |
|
%tr |
「HH:MM:SS PM」形式(12時間制) |
02:25:51 午後 |
|
%tT |
「HH:MM:SS」形式(24時間制) |
14:28:16 |
|
%tR |
「HH:MM」形式(24時間制) |
14:28 |
詳細printf解析については以下を参照してください:Java フォーマット出力 printf の例
例
例
public class DateFormatExample {
public static void main(String[] args) {
Date date = new Date();
System.out.printf("%tY-%tm-%td %tH:%tM:%tS %tZ", date, date, date, date, date, date, date);
}
}
実行出力結果は次のとおりです:
2023-02-24 13:34:45 GMT+08:00
例
上記の例をコンパイルして実行した結果は次のとおりです:
全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012 年-月-日格式:2012-09-10 月/日/年格式:09/10/12 HH:MM:SS PM格式(12时制):10:43:36 上午 HH:MM:SS格式(24时制):10:43:36 HH:MM格式(24时制):10:43
日付を繰り返し指定する必要がある場合、この方法で各部分をフォーマットするのは少し複雑です。そのため、フォーマットされる引数のインデックスを指定するフォーマット文字列を使用できます。
インデックスは、直後に置く必要があります%の後に置き、さらに$で終わる必要があります。例:
例
上記の例をコンパイルして実行した結果は次のとおりです:
Due date: February 09, 2014
または、< フラグを使用できます。これは、以前にフォーマットされた引数が再び使用されることを示します。例:
例
上記の例をコンパイルして実行した結果は次のとおりです:
Due date: February 09, 2014
日付形式を定義する変換文字を使用すると、日付は指定された変換文字によって新しい文字列を生成できます。これらの日付変換文字は次のとおりです:
例
出力結果は次のとおりです:
英文月份简称:May 本地月份简称:五月 英文月份全称:May 本地月份全称:五月 英文星期的简称:Thu 本地星期的简称:星期四 年的前两位数字(不足两位前面补0):20 年的后两位数字(不足两位前面补0):17 一年中的天数(即年的第几天):124 两位数字的月份(不足两位前面补0):05 两位数字的日(不足两位前面补0):04 月份的日(前面不补0):4
文字列を時刻に解析
SimpleDateFormat クラスにはいくつかの追加メソッドがあります。特に parse() は、指定された SimpleDateFormat オブジェクトに格納されたフォーマットに従って文字列を解析しようとします。例:
例
上記の例をコンパイルして実行した結果は次のとおりです:
$ java DateDemo 1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818 $ java DateDemo 2007-12-01 2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
Java スリープ(sleep)
sleep() は現在のスレッドを停止状態(現在のスレッドをブロック)にし、CPUの使用を譲ります。目的は、現在のスレッドがプロセスが取得したCPUリソースを独占しないようにし、他のスレッドに実行の機会を残すことです。
プログラムを1ミリ秒間スリープさせたり、コンピュータの寿命と同じくらい長い任意の時間スリープさせることができます。例えば、次のプログラムは3秒間スリープします:
例
上記の例をコンパイルして実行した結果は次のとおりです:
Thu Sep 17 10:20:30 CST 2015 Thu Sep 17 10:20:33 CST 2015
時間の計測
次の例は、時間間隔(ミリ秒単位)を測定する方法を示しています:
例
上記の例をコンパイルして実行した結果は次のとおりです:
Fri Jan 08 09:48:47 CST 2016 Fri Jan 08 09:48:50 CST 2016 Difference is : 3019
Calendar クラス
これで日付オブジェクトをフォーマットして作成できるようになりました。しかし、時、日、分などの日付データの特定の部分を設定および取得するにはどうすればよいでしょうか?また、日付のこれらの部分に値を加算または減算するにはどうすればよいでしょうか?答えは Calendar クラスを使用することです。
Calendarクラスの機能はDateクラスよりもはるかに強力で、実装方式もDateクラスよりも複雑です。
Calendarクラスは抽象クラスであり、実際に使用する際には特定のサブクラスのオブジェクトを生成する必要があります。オブジェクトの作成プロセスはプログラマーにとって透過のであるため、getInstanceメソッドを使用して作成するだけで済みます。
システムの現在日付を表す Calendar オブジェクトを作成
Calendar c = Calendar.getInstance();//默认是当前日期
指定した日付の Calendar オブジェクトを作成
Calendarクラスを使用して特定の時間を表すには、まずCalendarオブジェクトを作成し、その後そのオブジェクトの年月日パラメータを設定する必要があります。
//创建一个代表2009年6月12日的Calendar对象 Calendar c1 = Calendar.getInstance(); c1.set(2009, 6 - 1, 12);
Calendar クラスオブジェクトのフィールド型
Calendarクラスでは以下の定数を使用して異なる意味を表します。JDK内の多くのクラスは実際にこの考え方を採用しています。
| 定数 | 説明 |
|---|---|
| Calendar.YEAR | 年 |
| Calendar.MONTH | 月 |
| Calendar.DATE | 日 |
| Calendar.DAY_OF_MONTH | 日付。上記のフィールドと意味は完全に同じです |
| Calendar.HOUR | 12時間制の時 |
| Calendar.HOUR_OF_DAY | 24時間制の時 |
| Calendar.MINUTE | 分 |
| Calendar.SECOND | 秒 |
| Calendar.DAY_OF_WEEK | 曜日 |
Calendar クラスオブジェクト情報の設定
Set設定
例:
Calendar c1 = Calendar.getInstance();
呼び出し:
public final void set(int year,int month,int date)
c1.set(2009, 6, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12
フィールド型を利用した設定
特定のフィールド(例えば日付の値)だけを設定する場合は、次のようなsetメソッドを使用できます:
public void set(int field,int value)
c1オブジェクトが表す日付を10日に設定します。他のすべての数値は再計算されます
c1.set(Calendar.DATE,10);
c1オブジェクトが表す年を2008年に設定します。他のすべての数値は再計算されます
c1.set(Calendar.YEAR,2008);
他のフィールド属性のsetの意味もこれに準じます
Add設定
Calendar c1 = Calendar.getInstance();
c1オブジェクトの日付に10を加えます。つまりc1は10日後の日付を表すことになり、他のすべての数値は再計算されます
c1.add(Calendar.DATE, 10);
c1オブジェクトの日付から10を引きます。つまりc1は10日前の日付を表すことになり、他のすべての数値は再計算されます
c1.add(Calendar.DATE, -10);
他のフィールド属性のaddの意味もこれに準じます
Calendar クラスオブジェクト情報の取得
GregorianCalendar クラス
Calendarクラスはグレゴリオ暦を実装しており、GregorianCalendarはCalendarクラスの具体的な実装の1つです。
CalendarのgetInstance()メソッドは、デフォルトで現在のロケールとタイムゾーンで初期化されたGregorianCalendarオブジェクトを返します。GregorianCalendarはADとBCという2つのフィールドを定義しています。これはグレゴリオ暦で定義された2つの時代を表します。
以下にGregorianCalendarオブジェクトのいくつかのコンストラクタメソッドを示します:
| 番号 | コンストラクタと説明 |
| 1 |
GregorianCalendar() デフォルトのロケールを持つデフォルトのタイムゾーンで、現在の時間を使用してデフォルトのGregorianCalendarを構築します。 |
| 2 |
GregorianCalendar(int year, int month, int date) デフォルトのロケールを持つデフォルトのタイムゾーンで、指定された日付設定を持つGregorianCalendarを構築します |
| 3 |
GregorianCalendar(int year, int month, int date, int hour, int minute) デフォルトのロケールを持つデフォルトのタイムゾーン向けに、指定された日付と時刻の設定を持つGregorianCalendarを構築します。 |
| 4 |
GregorianCalendar(int year, int month, int date, int hour, int minute, int second) デフォルトのロケールを持つデフォルトのタイムゾーン向けに、指定された日付と時刻の設定を持つGregorianCalendarを構築します。 |
| 5 |
GregorianCalendar(Locale aLocale) 指定されたロケールを持つデフォルトのタイムゾーンで、現在の時間に基づくGregorianCalendarを構築します。 |
| 6 |
GregorianCalendar(TimeZone zone) デフォルトのロケールを持つ指定されたタイムゾーンで、現在の時間に基づくGregorianCalendarを構築します。 |
| 7 |
GregorianCalendar(TimeZone zone, Locale aLocale) 指定されたロケールを持つ指定されたタイムゾーンで、現在の時間に基づくGregorianCalendarを構築します。 |
ここにGregorianCalendarクラスが提供するいくつかの便利なメソッドのリストを示します:
| 番号 | メソッドと説明 |
| 1 |
void add(int field, int amount) カレンダーの規則に従って、指定された(符号付きの)時間量を指定されたカレンダーフィールドに追加します。 |
| 2 |
protected void computeFields() UTCミリ秒値を時間フィールド値に変換します |
| 3 |
protected void computeTime() Calendarをオーバーライドし、時間フィールド値をUTCミリ秒値に変換します |
| 4 |
boolean equals(Object obj) このGregorianCalendarを指定されたObjectと比較します。 |
| 5 |
int get(int field) 指定されたフィールドの時間値を取得します |
| 6 |
int getActualMaximum(int field) 現在の日付における、指定されたフィールドの最大値を返します |
| 7 |
int getActualMinimum(int field) 現在の日付における、指定されたフィールドの最小値を返します |
| 8 |
int getGreatestMinimum(int field) このGregorianCalendarインスタンスの指定されたカレンダーフィールドの最高の最小値を返します。 |
| 9 |
Date getGregorianChange() グレゴリオ暦の変更日を取得します。 |
| 10 |
int getLeastMaximum(int field) このGregorianCalendarインスタンスの指定されたカレンダーフィールドの最低の最大値を返します |
| 11 |
int getMaximum(int field) このGregorianCalendarインスタンスの指定されたカレンダーフィールドの最大値を返します。 |
| 12 |
Date getTime() カレンダーの現在時刻を取得します。 |
| 13 |
long getTimeInMillis() 長整数型で表されるカレンダーの現在時刻を取得します |
| 14 |
TimeZone getTimeZone() タイムゾーンを取得します。 |
| 15 |
int getMinimum(int field) 指定されたフィールドの最小値を返します。 |
| 16 |
int hashCode() hashCodeをオーバーライドします。 |
| 17 |
boolean isLeapYear(int year) 指定された年がうるう年かどうかを判定します。 |
| 18 |
void roll(int field, boolean up) 指定された時間フィールドに単一の時間単位を追加または減算(上/下)し、より大きなフィールドは変更しません。 |
| 19 |
void set(int field, int value) 指定された値で時間フィールドを設定します。 |
| 20 |
void set(int year, int month, int date) 年、月、日の値を設定します。 |
| 21 |
void set(int year, int month, int date, int hour, int minute) 年、月、日、時、分の値を設定します。 |
| 22 |
void set(int year, int month, int date, int hour, int minute, int second) 年、月、日、時、分、秒の値を設定します。 |
| 23 |
void setGregorianChange(Date date) GregorianCalendarの変更日を設定します。 |
| 24 |
void setTime(Date date) 指定された日付でCalendarの現在時刻を設定します。 |
| 25 |
void setTimeInMillis(long millis) 指定されたlong型のミリ秒数でCalendarの現在時刻を設定します。 |
| 26 |
void setTimeZone(TimeZone value) 指定されたタイムゾーン値で現在のタイムゾーンを設定します。 |
| 27 |
String toString() カレンダーを表す文字列を返します。 |
例
例
上記のサンプルをコンパイルして実行した結果は次のとおりです:
Date: Apr 22 2009 Time: 11:25:27 当前年份不是闰年
Calendarクラスの完全なリストについては、標準のJavaドキュメント。
その他の拡張