マスター Java 日付書式設定:SimpleDateFormat と DateFormat の説明
はじめに
SimpleDateFormat java.util.Date のフォーマットと解析 カスタム パターン文字列を使用した値、および DateFormat は、ロケールを認識した日付と時刻の書式設定のための抽象的な基本 API を提供します。まだ java.util.Date に依存しているレガシー Java コードを維持する場合は、これらの API を使用してください。;新しいコードの場合は、DateTimeFormatter を優先します。 SimpleDateFormat のため、Java 8 以降の日付/時刻 API から はスレッドセーフではありません。
このチュートリアルでは、DateFormat の使用方法を示します。 と SimpleDateFormat フォーマット、解析、タイムゾーン変換、ロケール固有の出力用。 setLenient(false) による厳密な検証についても説明します。 、スレッド安全性の回避策、および DateTimeFormatter への実際的な移行パス .
重要なポイント
DateFormatは抽象書式設定 API、SimpleDateFormatパターンベースの書式設定と解析の具体的な実装ですSimpleDateFormat年、月、日、時間フィールド、タイムゾーン出力の豊富なパターン トークンをサポート- 共有
SimpleDateFormatインスタンスは内部状態が変更可能なため、マルチスレッド コードでは安全ではありません ThreadLocal<SimpleDateFormat>従来のコードをすぐに移行できない場合に、スレッドごとにフォーマッタ インスタンスを分離しますDateTimeFormatter不変でスレッドセーフであるため、新しい Java コードの代替として推奨されます.parse()ParseExceptionをスローできます そのため、コードの解析では try-catch と有用なエラー メッセージを使用する必要がありますsetLenient(false)2024-13-45などの無効な日付がサイレントに調整されるのを防ぎます。- 常に明示的な
Localeを渡します。 サーバー展開における環境依存の出力を回避するため
Java の SimpleDateFormat とは何ですか?
SimpleDateFormat DateFormat です Java でのフォーマットと解析のための明示的な日付/時刻パターンを定義できるサブクラス。
DateFormat を使用してください ファクトリ メソッドを通じてスタイルベースでロケールを認識した出力が必要な場合は、SimpleDateFormat を使用します。 "dd-MM-yyyy" などの正確なパターン制御が必要な場合 または "yyyy-MM-dd'T'HH:mm:ssZ" 。 DateFormat スタイル定数 (SHORT) 、MEDIUM 、LONG 、FULL ) 正確な地域の日付順序を知る必要がなく、ロケールに適した出力を生成します。これは、形式がユーザーのロケール規則に従う必要があるユーザー向けの表示文字列に役立ちます。 SimpleDateFormat を使用してください 出力形式が API コントラクト、ログ形式、ファイル命名規則などの外部要件によって固定されている場合。これらの場合はロケールに関係なく正確なパターンが必要となるためです。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Locale locale = Locale.US;
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
String styleBased = dateFormat.format(new Date());
SimpleDateFormat patternBased = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", locale);
String patternOutput = patternBased.format(new Date());
System.out.println(styleBased);
System.out.println(patternOutput);
Jan 5, 2026
05-01-2026 14:30:22
new Locale(String, String) Java 19 では非推奨になりました。Locale.Builder を使用してください 代わりに。
Locale locale = new Locale.Builder()
.setLanguage("en")
.setRegion("US")
.build();
日付の代わりに時間を書式設定するには、DateFormat.getTimeInstance() を使用します。 同じロケールとスタイルのパラメータを使用します。
Locale locale = Locale.US;
DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
System.out.println(timeFormat.format(new Date()));
Output depends on the current time and timezone, for example:
2:30:45 PM
最新の Java 日付/時刻 API のより広範な概要については、「Java 8 Date、LocalDate、LocalDateTime、Instant、および Java 8 の機能と例」を参照してください。
SimpleDateFormat パターン構文リファレンス
SimpleDateFormat パターン文字は日付/時刻コンポーネントに直接マッピングされ、正しいパターンの選択により、出力形式と解析動作の両方が制御されます。
G 元号指定子G AD y 年yyyy 2026 M 年の月MMMM January w 年の週w 3 W 月内の週W 1 D 年間の日D 15 d 月の日dd 05 F 月の曜日F 1 E 週の曜日名EEE Mon u 週の曜日番号 (1 = Monday) )u 1 a AM/PM マーカーa PM H 1 日の時間 (0-23) )HH 14 k 1 日の時間 (1-24) )k 14 K 午前/午後の時間 (0-11) )K 2 h 午前/午後の時間 (1-12) )hh 02 m 時分mm 30 s 分内秒ss 45 S ミリ秒SSS 123 z 一般的なタイムゾーンz IST Z RFC 822 タイムゾーン オフセットZ +0530 X ISO 8601 タイムゾーン オフセットXXX +05:30 パターンの繰り返しと出力幅
パターン文字を繰り返すと、幅、数字のパディング、またはテキスト スタイルが変わります。
M 1 月MM 01 月MMM Jan 月MMMM January 月の日d 5 月の日dd 05 時 (0-23) )H 7 時 (0-23) )HH 07 年yy 26 年yyyy 2026 期待される出力を含む一般的なパターンの例
これらの一般的なパターンは、ログ、API、およびユーザーに表示される日付に役立ちます。
MM/dd/yyyy 01/05/2026 dd-M-yyyy hh:mm:ss 05-1-2026 02:30:45 dd MMMM yyyy 05 January 2026 dd MMMM yyyy zzzz 05 January 2026 India Standard Time E, dd MMM yyyy HH:mm:ss z Mon, 05 Jan 2026 14:30:45 IST SimpleDateFormat を使用して日付をフォーマットする方法
Date をフォーマットするには 、SimpleDateFormat を作成します。 パターンを指定して .format(date) を呼び出します .
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date now = new Date();
SimpleDateFormat basic = new SimpleDateFormat("MM-dd-yyyy", Locale.US);
SimpleDateFormat withTime = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.US);
SimpleDateFormat isoLike = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
System.out.println(basic.format(now));
System.out.println(withTime.format(now));
System.out.println(isoLike.format(now));
01-05-2026
05-01-2026 14:30:45
2026-01-05T14:30:45+0000
SimpleDateFormat フォーマッタ インスタンスからタイムゾーンとロケールのルールを適用するため、出力に一貫性が必要な場合は、これらの値を明示的に設定します。
SimpleDateFormat を使用して文字列を日付に解析する方法
文字列を Date に解析するには 、正確な入力パターンでフォーマッタを作成し、.parse(input) を呼び出します。 .
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
try {
SimpleDateFormat dateParser = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
Date parsedDate = dateParser.parse("05-01-2026");
System.out.println(parsedDate);
SimpleDateFormat timeParser = new SimpleDateFormat("HH:mm:ss", Locale.US);
Date parsedTime = timeParser.parse("22:15:09");
System.out.println(parsedTime);
} catch (ParseException e) {
e.printStackTrace();
}
Mon Jan 05 00:00:00 UTC 2026
Thu Jan 01 22:15:09 UTC 1970
時刻のみが指定された場合、Java は日付部分としてエポック日付を使用します。
ParseException を正しく処理する
parse() ParseException をスローします 入力が設定されたパターンと一致しない場合、実稼働コードはそれをキャッチし、生の入力と予期されるパターンの両方をログに記録する必要があります。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String input = "31/01/2026";
String pattern = "dd-MM-yyyy";
SimpleDateFormat parser = new SimpleDateFormat(pattern, Locale.US);
try {
parser.parse(input);
System.out.println("Parsed successfully");
} catch (ParseException e) {
// Include both the input value and pattern for easier debugging.
System.err.println("Failed to parse date string: " + input);
System.err.println("Expected pattern: " + pattern);
System.err.println("Parser error: " + e.getMessage());
}
Failed to parse date string: 31/01/2026
Expected pattern: dd-MM-yyyy
Parser error: Unparseable date: "31/01/2026"
サービス間で再利用できる例外処理パターンについては、「Java および Java 8 の例外処理」の「Date、LocalDate、LocalDateTime、Instant」を参照してください。
解析前の日付文字列の検証
SimpleDateFormat デフォルトでは寛容であるため、無効な値は失敗せずにロールオーバーできます。 setLenient(false) に電話をかける 厳密な検証を強制するため。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
String invalid = "2024-13-45";
SimpleDateFormat lenientParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
SimpleDateFormat strictParser = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
strictParser.setLenient(false);
System.out.println("Lenient parse result:");
try {
// Lenient mode silently rolls over invalid values instead of throwing.
System.out.println(lenientParser.parse(invalid));
} catch (ParseException e) {
System.out.println("ParseException: " + e.getMessage());
}
System.out.println("Strict parse result:");
try {
System.out.println(strictParser.parse(invalid));
} catch (ParseException e) {
System.out.println("ParseException: " + e.getMessage());
}
Lenient parse result:
Fri Feb 14 00:00:00 UTC 2025
Strict parse result:
ParseException: Unparseable date: "2024-13-45"
SimpleDateFormat でのタイムゾーンの処理
SimpleDateFormat 同じ Date をレンダリングできます 出力前にフォーマッタでタイムゾーンを設定することで、異なるタイムゾーンで使用できます。 Date オブジェクトは UTC ミリ秒カウントのみを保存し、独自のタイムゾーンを保持しません。タイムゾーンはフォーマットの問題であり、ストレージの問題ではありません。同じDate 値は、フォーマッタが適用するタイムゾーンに応じて、人間が判読できる異なる出力を生成します。これは setTimeZone() を意味します format() より前にフォーマッタで呼び出す必要があります と呼ばれます。後で設定しても、すでに生成された出力には影響しません。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
Date timestamp = new Date(1700000000000L); // Fixed instant for repeatable output
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println("New York: " + formatter.format(timestamp));
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
System.out.println("Kolkata: " + formatter.format(timestamp));
UTC: 2023-11-14 22:13:20 +0000
New York: 2023-11-14 17:13:20 -0500
Kolkata: 2023-11-15 03:43:20 +0530
より詳細なタイムゾーン変換パターンについては、「Java 日付を特定のタイムゾーン形式に変換する方法」を参照してください。
タイムゾーンのよくある間違いとその回避方法
タイムゾーンのバグは、保存されたインスタントとレンダリングされた現地時間の混同から発生することがよくあります。
DateUTC ミリ秒を保存し、タイムゾーンはフォーマット時にのみ適用されます。setTimeZone()に電話をかけています マルチスレッド環境の共有フォーマッタ インスタンスでは、別のスレッドのインフライト呼び出しの操作中にタイムゾーンが変更され、例外がスローされずに間違ったタイムゾーンで出力が生成される可能性があります- 単一の
SimpleDateFormatを再利用する サーブレットまたは Spring コントローラーの HTTP リクエスト全体でインスタンスが発生すると、1 つのリクエストのsetTimeZone()が発生する可能性があります 別のリクエストの出力に影響を与えるために呼び出します。リクエストごとに新しいインスタンスを作成するか、ThreadLocal<SimpleDateFormat>を使用します 状態を分離する TimeZone.getTimeZone("Invalid/Zone")メソッド コントラクトでは、例外をスローするのではなく、認識されない ID のデフォルトとして GMT を指定しているため、サイレントに GMT にフォールバックします。ZoneId.of()を使用してゾーン ID を検証しますjava.timeからTimeZone.getTimeZone()に渡す前に;ZoneId.of()ZoneRulesExceptionをスローします 無効な ID の場合、問題が明らかになる
ロケール対応の日付形式
フランス語の月名やドイツ語の日名など、ロケール固有の日付出力を生成するには、Locale を渡します。 SimpleDateFormat へ コンストラクター。組み込み定数 Locale.US を使用します。 、Locale.UK 、Locale.FRENCH 、Locale.GERMAN 、一般的な地域の場合、または Locale.Builder を使用してカスタム ロケールを構築します 定数でカバーされていない領域が必要な場合。 Locale 月名、日名、AM/PM マーカーなどのテキスト フィールドに使用する言語を制御します。
SimpleDateFormat コンストラクターでのロケールの指定
Locale を渡します 2 番目のコンストラクター引数として。省略した場合は、SimpleDateFormat Locale.getDefault() を呼び出します これにより、フォーマッタが JVM のランタイム ロケールに内部的にバインドされます。この値は、開発者マシン、CI 環境、および異なる OS ロケール設定で実行されている運用サーバー間で異なります。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
Date sample = new Date(1700000000000L);
String pattern = "EEEE, dd MMMM yyyy";
SimpleDateFormat usFormatter = new SimpleDateFormat(pattern, Locale.US);
SimpleDateFormat frFormatter = new SimpleDateFormat(pattern, Locale.FRENCH);
String usDate = usFormatter.format(sample);
String frDate = frFormatter.format(sample);
System.out.println("US: " + usDate);
System.out.println("French: " + frDate);
US: Tuesday, 14 November 2023
French: mardi, 14 novembre 2023
地域ごとに月と日の名前を書式設定する
同じパターンでも、ロケールごとに異なるテキスト出力が生成されます。
Locale.US EEEE, dd MMMM yyyy Tuesday, 14 November 2023 Locale.FRENCH EEEE, dd MMMM yyyy mardi, 14 novembre 2023 Locale.GERMAN EEEE, dd MMMM yyyy Dienstag, 14 November 2023
Locale.getDefault() に依存する サーバー環境で実行されている JVM では、OS ロケール設定がホスト間で異なるため、一貫性のない出力が生成される可能性があります。常に明示的な Locale を渡します。 .
SimpleDateFormat に関するスレッドの安全性の問題
SimpleDateFormat がスレッドセーフではない理由
SimpleDateFormat 内部 Calendar を変更します と NumberFormat 解析/フォーマット操作中の状態。複数のスレッドが 1 つのインスタンスを使用する場合、これらの可変フィールドは操作中に上書きされる可能性があり、競合状態や予測不可能な出力が発生します。実際には、これは、あるスレッドの日付が別のスレッドの結果、.parse() に現れるという形で現れます。 例外なく完全に間違った日付、または ArrayIndexOutOfBoundsException を返す フォーマッタ自体の内部からスローされます。これらの障害は断続的で負荷に依存するため、シングルスレッドのテスト環境で再現するのが困難です。
従来のコードで同時実行安全な書式設定が必要な場合は、スレッドまたはリクエストのスコープごとにインスタンスを分離します。 Java スレッド動作の背景については、「Java スレッドの例」を参照してください。
ThreadLocal を使用して SimpleDateFormat インスタンスを分離する
ThreadLocal<SimpleDateFormat> 各スレッドに独自のフォーマッタ インスタンスを与え、共有の可変状態を回避します。サーブレット コンテナや Spring アプリケーションなどのスレッド プール環境では、スレッドはリクエスト間で再利用され、決して終了されません。これは ThreadLocal を意味します。 値が自動的に削除されることはありません。常に FORMATTER.remove() を呼び出します。 オペレーションが完了した後、そうでない場合、フォーマッタ インスタンスはスレッドの存続期間中存続し、持続的な負荷の下でメモリ リークとして蓄積されます。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class ThreadSafeLegacyFormatter {
// Each thread gets one dedicated formatter instance.
private static final ThreadLocal<SimpleDateFormat> FORMATTER =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US));
public static String format(Date date) {
try {
// No cross-thread mutation because each thread reads its own formatter.
return FORMATTER.get().format(date);
} finally {
// Remove the instance after use to prevent memory leaks in thread pools.
FORMATTER.remove();
}
}
}
スレッドセーフな代替手段として DateTimeFormatter に切り替える
DateTimeFormatter は不変でスレッドセーフであるため、1 つの共有静的インスタンスは安全です。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
// Not thread-safe when shared across threads
SimpleDateFormat unsafe = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(unsafe.format(new Date()));
// Thread-safe: DateTimeFormatter is immutable and can be stored as a static field
DateTimeFormatter safe = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
System.out.println(safe.format(LocalDateTime.now()));
2026-01-05 14:30:22
2026-01-05 14:30:22
SimpleDateFormat から DateTimeFormatter への移行
DateTimeFormatter への移行 スレッドセーフのリスクを除去し、ThreadLocal を排除します。 回避策があり、java.time ときれいに統合されています。 タイプ。ほとんどのコードベースでは、移行は機械的に行われます。パターン構文はほぼ同一であり、増分ロールアウト中に 2 つの API が共存でき、すべてを一度に変換する必要はありません。主なリスクは u です。 SimpleDateFormat の曜日を意味する記号 DateTimeFormatter の年;これをチェックせずに API 間でパターンを直接コピーすると、暗黙のうちに間違った出力が生成されます。
コードを並べて比較
この並べたスニペットは、従来の API と最新の API における同等の書式設定と解析動作を示しています。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
String pattern = "yyyy-MM-dd";
String input = "2026-01-05";
// SimpleDateFormat (legacy java.util.Date API)
SimpleDateFormat legacyFormatter = new SimpleDateFormat(pattern, Locale.US);
Date legacyParsed = legacyFormatter.parse(input);
String legacyFormatted = legacyFormatter.format(new Date());
// DateTimeFormatter (modern java.time API)
DateTimeFormatter modernFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US);
LocalDate modernParsed = LocalDate.parse(input, modernFormatter);
String modernFormatted = modernFormatter.format(LocalDate.now());
System.out.println(legacyParsed);
System.out.println(legacyFormatted);
System.out.println(modernParsed);
System.out.println(modernFormatted);
Mon Jan 05 00:00:00 UTC 2026
2026-01-05
2026-01-05
2026-01-05
2 つの API 間のパターン構文の違い
ほとんどのパターン文字は似ていますが、一部の記号は異なっており、直接コピーすると移行が中断される可能性があります。
yyyy uuuu または yyyy uuuu を優先します java.time に 予測年の一貫性のためのタイムゾーン オフセット/名前z 、Z 、X z 、Z 、x 、X java.time より多くのオフセット バリアントを区別します (x) および X )リテラルテキスト'T' 'T' どちらの API もリテラルに一重引用符を使用しますu シンボル曜日番号年既知の問題点:u API間で意味を変える 段階的な移行チェックリスト
このチェックリストを使用して、既存のコードベースで一度に 1 つのフォーマッタを変換します。
<オル>import java.text.SimpleDateFormat; を置き換えます import java.time.format.DateTimeFormatter; を使用 new SimpleDateFormat("yyyy-MM-dd") を置き換えます DateTimeFormatter.ofPattern("yyyy-MM-dd") を使用 .parse() を置き換えます LocalDate.parse() を使用 または LocalDateTime.parse() 入力精度に応じて.format(date) を置き換えます formatter.format(localDate) を使用 または formatter.format(localDateTime) new Date() を削除します 可能な場合は LocalDate.now() を使用してください または Instant.now()
DateTimeFormatter java.time でのみ動作します タイプ (LocalDate 、LocalDateTime 、ZonedDateTime 、Instant )。 java.util.Date は受け入れられません 直接的に。まだ java.util.Date を生成するコードがある場合 たとえば、レガシー ORM または JDBC ドライバーからの値は、最初に date.toInstant() で変換されます。 DateTimeFormatter に渡す前に 。 2 つの API は、増分移行中に同じコードベース内に共存できます。すべてを一度に変換する必要はありません。 DateTimeFormatter ParseException も置き換えます java.time.format.DateTimeParseException を使用 これは未チェックの例外であるため、try-catch ブロックはオプションになりますが、本番環境の解析コードでは引き続き推奨されます。
移行コンテキストとタイプの選択については、「Java 8 Date、LocalDate、LocalDateTime、Instant」を参照してください。
よくある質問
Java の SimpleDateFormat と DateFormat の違いは何ですか?
DateFormat は、日付/時刻の書式設定の規約を定義する抽象クラスです。 SimpleDateFormat カスタムのパターンベースの書式設定を可能にする具体的なサブクラスです。 SimpleDateFormat を使用します コード内で直接; DateFormat を使用します 実装を受け入れる場合は、参照型として使用します。
SimpleDateFormat はスレッドセーフですか?
番号 SimpleDateFormat インスタンスはスレッドセーフではありません。同期せずにスレッド間で単一のインスタンスを共有すると、予測できない解析結果とフォーマット結果が発生します。 ThreadLocal<SimpleDateFormat> を使用してください または、java.time.format.DateTimeFormatter に置き換えます。 、これは不変でスレッドセーフです。
SimpleDateFormat を使用して dd-MM-yyyy 形式の日付文字列を解析するにはどうすればよいですか?
SimpleDateFormat をインスタンス化します パターン "dd-MM-yyyy" の場合 次に、.parse(yourString) を呼び出します。 。 ParseException の呼び出しを try-catch ブロックでラップします。 。入力文字列が区切り文字も含めてパターンと正確に一致することを確認してください。
SimpleDateFormat を使用して日付を別のタイムゾーンに変換するにはどうすればよいですか?
.setTimeZone(TimeZone.getTimeZone("America/New_York")) に電話します SimpleDateFormat で .format(date) を呼び出す前のインスタンス 。基礎となる Date オブジェクトは UTC ミリ秒を保持します。フォーマッタは出力中にタイムゾーン オフセットを適用します。
パターン「yyyy-MM-dd'T'HH:mm:ssZ」は何を生成しますか?
ISO 8601 互換のタイムスタンプ (例:2024-06-15T14:30:00+0530) を生成します。 。 T は一重引用符で囲まれたリテラル文字です。 Z は、RFC 822 タイムゾーン オフセットを表します。
SimpleDateFormat から DateTimeFormatter に移行するにはどうすればよいですか?
new SimpleDateFormat("yyyy-MM-dd") を置き換えます DateTimeFormatter.ofPattern("yyyy-MM-dd") を使用 。 .parse() を置き換えます LocalDate.parse() で呼び出します または LocalDateTime.parse() 。 .format(date) を置き換えます formatter.format(localDate) で呼び出します 。 DateTimeFormatter に注意してください。 u を使用します 一部のコンテキストでは、y ではなく年を表します。 .
SimpleDateFormat が例外をスローせずに無効な日付を解析するのはなぜですか?
デフォルトでは、SimpleDateFormat は範囲外の値を拒否するのではなく調整する寛大な解析モードを使用します。 .setLenient(false) に電話します 厳密な検証を強制して ParseException をスローするために解析する前に 無効な入力の場合。
SimpleDateFormat を使用して特定のロケールで日付をフォーマットするにはどうすればよいですか?
Locale を渡します コンストラクターの 2 番目の引数として:new SimpleDateFormat("dd MMMM yyyy", Locale.FRENCH) 。これにより、月と日の名前が指定された言語で表示されます。これは、複数の地域にサービスを提供するアプリケーションにとって重要です。
結論
このガイドでは DateFormat について説明しました および SimpleDateFormat 基本、パターン構文、ワークフローの書式設定と解析、タイムゾーンの動作、ロケール対応レンダリング、スレッド セーフティの問題、DateTimeFormatter への移行 .
従来のコードと最新のコードに適切なフォーマッタを選択し、厳密な検証によって入力を防御的に解析し、サーバー環境でのロケールとタイムゾーンのドリフトを回避し、共有日付フォーマッタによる同時実行リスクを排除できるようになりました。
次のステップについては、Java 8 Date、LocalDate、LocalDateTime、Instant、Java 8 の機能と例、Java での例外処理、および Java 日付を特定の TimeZone 形式に変換する方法を確認して、Java アプリケーションでの日付/時刻処理の最新化を続けてください。
参考文献:
- SimpleDateFormat API ドキュメント
- DateFormat API ドキュメント
- DateTimeFormatter API ドキュメント
この作品は、クリエイティブ コモンズ 表示 - 非営利 - 継承 4.0 国際ライセンスに基づいてライセンスされています。
-
データ構造のオイラーグラフとハミルトングラフ
このセクションでは、オイラーグラフとハミルトングラフを表示します。しかし、それに飛び込む前に、最初にグラフの軌跡が何であるかを確認する必要があります。以下のようなグラフが1つあるとします- トレイルはパスであり、エッジ(v1、v2)、(v2、v3)、…、(vk-1、vk)のシーケンスであり、すべての頂点(v1、v2、…、vk)が区別されない場合があります。 、ただし、すべてのエッジが異なります。この例では、1つのトレイルは{(B、A)、(A、C)、(C、D)、(D、A)、(A、F)}です。これはトレイルです。ただし、頂点Aが2回アクセスされるため、これは単純なパスとは見なされません。最
-
データ構造のB+ツリークエリ
ここでは、B+ツリーで検索を実行する方法を説明します。 B +ツリー検索は、B+ツリークエリとも呼ばれます。このアルゴリズムは、Bツリーのクエリと非常によく似ています。さらに、これは範囲クエリをサポートします。以下のようなB+ツリーがあるとします- B+ツリーの例 − 検索手法は、二分探索木と非常によく似ています。上記のツリーから63を検索するとします。したがって、ルートから開始します。63はルート要素60よりも大きく、75よりも小さくなります。したがって、要素60の右の子に移動します。右の子は63です。ただし、Bツリーを使用すると、次のようになります。結果。この場合、現在のノード