Java 日付と時刻

⚡ スマートサマリー

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

  • 🕒 レガシー日付: java.util.Date クラスは、ミリ秒単位の時刻を格納し、toString を介してデフォルトの文字列を出力します。
  • 🔤 パターン文字: SimpleDateFormat は、yyyy、MM、dd、HH、mm、ss、zzz などの文字を使用して、カスタム出力形式を定義します。
  • <XNUMXxEXNUMX><XNUMXxEXNUMX><XNUMXxXNUMXA><XNUMXxXNUMX><XNUMXxXNUMXA>️️ 比較: compareTo メソッドは、2 つの Date インスタンスを時系列順に並べるために、負、ゼロ、または正の整数を返します。
  • 🆕 最新のAPI: java.time の LocalDate、LocalDateTime、ZonedDateTime、および Instant は、Date と Calendar を不変オブジェクトに置き換えます。
  • 🧵 ねじの安全性: DateTimeFormatterは不変で安全に共有できますが、SimpleDateFormatは同期またはThreadLocalラッパーが必要です。
  • 🔁 相互運用性 Date.toInstant、Date.from、およびCalendar.toInstantヘルパーを使用して、旧APIと新API間の変換を行います。

Java 日付と時刻

日付と時刻の処理 Java これは、スケジューリングロジックの構築、タイムスタンプの記録、レポート作成、監査証跡の記録といった基本的な作業の一部です。コードを書く前に、日付を構成するパラメータを理解しておくと役立ちます。

  • その (2桁または4桁で表記)
  • その (2桁の数字、月の最初の3文字、または月名全体)
  • その date (実際の日付)
  • その (指定された日付の曜日名。例:日、月、火)

Java タイムライン上の特定の時点を記述する、時代、年内の週、タイムゾーン、オフセットなど、他にも多くのパラメータが公開されています。以下のセクションでは、それぞれのパラメータについて実行可能な例を交えて解説します。

日付の使い方 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
y2026
M年の月07月かXNUMX月かXNUMX月
w年間の週27
W月内の週2
D年間の日189
d月の日10
F月の曜日2
E週の曜日名火曜日または火曜日
u週の日番号 (1 = Monday(7=日曜日)1
a午前または午後のマーカーPM
H0 日の時間 (23 ~ XNUMX)0
k1 日の時間 (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 上記のパターン文字を使用して日付の書式設定と解析を行うことができます。これらの文字を組み合わせて、作成または読み取りたい文字列を正確に記述してください。

具体的な例を挙げますと、以下の通りです。

  1. 必要な日付形式: 2012.10.23 20:20:45 PST適切なフォーマットパターンは yyyy.MM.dd HH:mm:ss zzz.
  2. 必要な日付形式: 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 特定のタイムゾーンにおける日付と時刻。
  • OffsetDateTime UTCオフセットはあるものの、ゾーン名が指定されていない日付と時刻の場合。
  • Instant UNIXエポックから計測されたマシンタイムスタンプの場合。
  • 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 ゾーンがないので、変換します ZonedDateTime or Instant 特にログ、データベースの列、ネットワークペイロードなど、正確なタイミングが重要な場合。
  • 2つのAPI間の変換は慎重に行ってください。   date.toInstant(), Date.from(instant), calendar.toInstant().atZone(zone) レガシーコードとモダンコードの境界に位置する。
  • タイムスタンプはUTCで保存します。 粘り強く transmit 日付はUTC( Instant または ISO 8601 文字列)であり、表示時のみユーザー ゾーンに変換します。

よくあるご質問

システムゾーンでの日付と時刻を取得するには、java.time パッケージの LocalDateTime.now() を呼び出し、日付のみを取得するには LocalDate.now() を呼び出します。 Java現在の時刻を取得するには、新しい java.util.Date() を使用します。

java.util.Date は、エポックからのミリ秒単位の瞬間を表し、変更可能です。LocalDate は、時刻やタイムゾーンを含まないカレンダー日付をモデル化し、不変でスレッドセーフであり、plusDays や isBefore などのより分かりやすいメソッドを提供します。

いいえ。SimpleDateFormatは可変の解析状態を保持するため、スレッド間で共有すると誤った結果を生成します。ThreadLocalでラップするか、インスタンスで同期するか、または不変で安全なDateTimeFormatterに切り替えてください。

正確な文字列「yyyy-MM-dd」を渡してください。大文字のMMは月、小文字のmmは分を表します。完全な日付と時刻を指定する場合は、「yyyy-MM-dd HH:mm:ss」を使用してください。月の名前が再現性を保つため、必ずロケールを指定してください。

従来の Date オブジェクトを使用する場合は、compareTo メソッドを使用します。このメソッドは、負、ゼロ、または正の整数を返します。java.time オブジェクトを使用する場合は、LocalDate または Instant オブジェクトに対して isBefore、isAfter、または isEqual メソッドを呼び出します。どちらの方法も時系列順を尊重します。

`date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()` を呼び出します。前の日付に戻すには、`Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())` を使用します。正確な時刻が重要な場合は、ゾーンを明示的に指定してください。

ログや文書コーパスで学習されたAIモデルは、サンプル文字列から可能性のあるパターンを推測し、一致するDateTimeFormatterパターンを返します。機械学習分類器は、月-日順と日-月順など、曖昧なフィールドも識別します。

はい。GitHub Copilot は DateTimeFormatter パターン、ZonedDateTime 変換、 JUnit 地域設定に依存する出力のテスト。 Rev確定する前に、正しいパターン文字、地域、タイムゾーンについて各提案を確認してください。