Java 日付と時刻
⚡ スマートサマリー
Java 日付と時刻の処理は、従来の java.util.Date および SimpleDateFormat クラスと、2013 年に導入された最新の java.time API を組み合わせています。 Java 8. 開発者に、正確なカレンダー作業のための不変でスレッドセーフな型を提供する。

日付と時刻の処理 Java これは、スケジューリングロジックの構築、タイムスタンプの記録、レポート作成、監査証跡の記録といった基本的な作業の一部です。コードを書く前に、日付を構成するパラメータを理解しておくと役立ちます。
- その 年 (2桁または4桁で表記)
- その 月 (2桁の数字、月の最初の3文字、または月名全体)
- その date (実際の日付)
- その 中 (指定された日付の曜日名。例:日、月、火)
Java タイムライン上の特定の時点を記述する、時代、年内の週、タイムゾーン、オフセットなど、他にも多くのパラメータが公開されています。以下のセクションでは、それぞれのパラメータについて実行可能な例を交えて解説します。
日付の表示 Java
Java 提供 Date のクラス java.util パッケージ。このクラスは、特定の時刻をミリ秒単位の精度で格納し、その時刻を印刷、比較、フォーマットするためのヘルパーメソッドを提供します。現在の日時を取得するには、デフォルトコンストラクタを使用してクラスをインスタンス化します。
import java.util.Date; class Date_Ex1 { public static void main(String args[]) { // Instantiate a Date object by invoking its constructor Date objDate = new Date(); // Display the Date and Time using toString() System.out.println(objDate.toString()); } }
出力:
Wed Nov 29 06:36:22 UTC 2017
この例では、日付をデフォルトの toString フォーマットで出力します。同じ瞬間を別のパターンで表示するには、まずフォーマット文字を理解する必要があります。 Java 使用します。
SimpleDateFormat: 日付の解析とフォーマット
その SimpleDateFormat クラスイン java.text を変換します Date オブジェクトをフォーマットされた文字列に変換し、フォーマットされた文字列を解析して Date日付または時刻コンポーネントに対応するパターン文字を使用します。サポートされているすべての文字を以下の表に示します。
| 手紙 | 日付または時刻コンポーネント | 例: |
|---|---|---|
| G | 元号指定子 | AD |
| y | 年 | 2026 |
| M | 年の月 | 07月かXNUMX月かXNUMX月 |
| w | 年間の週 | 27 |
| W | 月内の週 | 2 |
| D | 年間の日 | 189 |
| d | 月の日 | 10 |
| F | 月の曜日 | 2 |
| E | 週の曜日名 | 火曜日または火曜日 |
| u | 週の日番号 (1 = Monday(7=日曜日) | 1 |
| a | 午前または午後のマーカー | PM |
| H | 0 日の時間 (23 ~ XNUMX) | 0 |
| k | 1 日の時間 (24 ~ XNUMX) | 24 |
| K | 午前または午後の時間帯(0~11時) | 0 |
| h | 午前または午後の時間帯(1~12時) | 12 |
| m | 時分 | 30 |
| s | 分単位で秒 | 55 |
| S | ミリ秒 | 978 |
| z | タイムゾーン(名前) | 太平洋標準時。 PST; GMT-08:00 |
| Z | タイムゾーン(RFC 822オフセット) | -0800 |
| X | タイムゾーン(ISO 8601オフセット) | -08 または -0800 または -08:00 |
表全体を覚えておく必要はありません。新しいパターンを作成する際に参照すれば十分です。
SimpleDateFormat の使い方
SimpleDateFormat のサブクラスです DateFormat 上記のパターン文字を使用して日付の書式設定と解析を行うことができます。これらの文字を組み合わせて、作成または読み取りたい文字列を正確に記述してください。
具体的な例を挙げますと、以下の通りです。
- 必要な日付形式: 2012.10.23 20:20:45 PST適切なフォーマットパターンは
yyyy.MM.dd HH:mm:ss zzz. - 必要な日付形式: 09:30:00 AM 23-May-2012適切なフォーマットパターンは
hh:mm:ss a dd-MMM-yyyy.
ヒント: 文字ケースを大文字で表示します。 M 月、小文字 m 非常に小さい。大文字 H 24時間表示の時計、小文字 h これは12時間制の時計です。これらを混同すると、誤った出力が静かに発生します。
以下のプログラムは、現在の日付を2回出力します。1回目はデフォルトの形式で、2回目はSimpleDateFormatパターンを使用して出力します。
import java.text.SimpleDateFormat; import java.util.Date; class TestDates_Format { public static void main(String args[]) { // Current system date and time is assigned to objDate Date objDate = new Date(); System.out.println(objDate); // Build the target pattern and format the date String strDateFormat = "hh:mm:ss a dd-MMM-yyyy"; SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat); System.out.println(objSDF.format(objDate)); } }
出力:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
日付の比較の例
2つ注文する最も確実な方法 Date オブジェクトは compareTo() このメソッドは、呼び出し元が先に発生した場合は負の整数を、両方の時点が等しい場合はゼロを、呼び出し元が後に発生した場合は正の整数を返します。以下のコードスニペットは、2 つの日付文字列を解析し、それらの相対的な順序を出力します。
import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; class TestDates_Compare { public static void main(String args[]) throws ParseException { SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy"); Date dt_1 = objSDF.parse("20-08-1981"); Date dt_2 = objSDF.parse("12-10-2012"); System.out.println("Date1 : " + objSDF.format(dt_1)); System.out.println("Date2 : " + objSDF.format(dt_2)); // compareTo returns > 0 when dt_1 is after dt_2 if (dt_1.compareTo(dt_2) > 0) { System.out.println("Date 1 occurs after Date 2"); } // compareTo returns < 0 when dt_1 is before dt_2 else if (dt_1.compareTo(dt_2) < 0) { System.out.println("Date 1 occurs before Date 2"); } // compareTo returns 0 when both dates are equal else { System.out.println("Both are the same date"); } } }
出力:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
注意: 元のコードではパターンが使用されていました dd-mm-yyyy。 小文字 mm 文字は月ではなく分を表すため、パーサーは黙って誤った月の値を生成していました。上記の修正では大文字を使用しています。 MM 月を表す正しいパターン文字はどれですか。
Java 8. 最新の日付と時刻のAPI(java.time)
Java 8 導入 java.time Joda-Timeライブラリに触発されて再設計されたAPIであるパッケージ。新しいクラスは不変でスレッドセーフであり、人間のカレンダーとマシンのタイムラインを分離します。最も一般的なタイプは次のとおりです。
LocalDate時間やタイムゾーンが指定されていない日付(例えば、誕生日)の場合。LocalTime日付やタイムゾーンを表示しない壁掛け時計の時刻表示用。LocalDateTimeタイムゾーンを指定しない日付と時刻の場合。ZonedDateTime特定のタイムゾーンにおける日付と時刻。OffsetDateTimeUTCオフセットはあるものの、ゾーン名が指定されていない日付と時刻の場合。InstantUNIXエポックから計測されたマシンタイムスタンプの場合。Duration(NAIST) とPeriod時間ベースおよび日付ベースの金額について。
以下の例は、最新のAPIを使用して現在の日付、時刻、タイムスタンプ、およびタイムゾーンを出力するものです。
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.Instant; import java.time.ZoneId; class ModernDateDemo { public static void main(String args[]) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")); Instant epoch = Instant.now(); System.out.println("LocalDate : " + today); System.out.println("LocalDateTime : " + now); System.out.println("ZonedDateTime : " + zoned); System.out.println("Instant : " + epoch); } }
各型にはファクトリ メソッドがあります (now, of, parse)および不変操作(plusDays, minusHours, withYear元のオブジェクトを変更するのではなく、新しい値を返すもの。
DateTimeFormatter: モダンで日付をフォーマットする Java
DateTimeFormatter in java.time.format 置き換え SimpleDateFormat同じスタイルのパターン文字を使用し、不変であり、追加の同期なしでスレッド間で安全に共有できます。このクラスは、次のような既製の定数も公開しています。 ISO_LOCAL_DATE (NAIST) と ISO_ZONED_DATE_TIME 標準フォーマットの場合。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class FormatterDemo { public static void main(String args[]) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME; DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy"); System.out.println(now.format(iso)); System.out.println(now.format(human)); LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso); System.out.println("Parsed back : " + parsed); } }
最新の API で 2 つの日付を比較するには、以下を呼び出します。 isBefore, isAfterまたは isEqualこれらの方法は、より明確に読み取ることができます。 compareTo そして、あらゆる人と協力する java.time とに提供されます。
ねじの安全性とベストプラクティス Java 日付と時刻
両方 java.util.Date (NAIST) と SimpleDateFormat 現代の同時進行よりも前 Javaそれぞれに既知の落とし穴があります。本番コードで日付処理を正しく行うには、以下の手順に従ってください。
- DateやCalendarよりもjava.timeを優先してください。 新しい型は不変でスレッドセーフであり、ドメインをより正確にモデル化します(時刻を含まない日付、タイムゾーンを含まない時刻など)。
- SimpleDateFormat をスレッド間で共有しないでください。 このクラスは内部の解析状態を保持しており、スレッドセーフではありません。
ThreadLocalインスタンス上で同期するか、切り替えますDateTimeFormatter. - 必ずロケールを指定してください。 月と日の名前はJVMのデフォルトロケールによって変わるため、次のようなパターンになります。
MMM(NAIST) とEEE移植性がありません。ロケールを明示的に渡します(例:Locale.ENGLISH). - タイムゾーンについて明確にしてください。
LocalDateTimeゾーンがないので、変換しますZonedDateTimeorInstant特にログ、データベースの列、ネットワークペイロードなど、正確なタイミングが重要な場合。 - 2つのAPI間の変換は慎重に行ってください。
date.toInstant(),Date.from(instant),calendar.toInstant().atZone(zone)レガシーコードとモダンコードの境界に位置する。 - タイムスタンプはUTCで保存します。 粘り強く transmit 日付はUTC(
Instantまたは ISO 8601 文字列)であり、表示時のみユーザー ゾーンに変換します。


