ホームページ >Java >&#&チュートリアル >SimpleDateFormat が日付の解析に失敗するのはなぜですか? Locale と DateTimeFormatter を使用して修正するにはどうすればよいですか?

SimpleDateFormat が日付の解析に失敗するのはなぜですか? Locale と DateTimeFormatter を使用して修正するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-29 11:21:14905ブラウズ

Why Does My SimpleDateFormat Fail to Parse Dates, and How Can I Fix It Using Locale and DateTimeFormatter?

常に SimpleDateFormat でロケールを指定し、カスタム形式には DateTimeFormatter を指定してください

問題:

日付の解析 - SimpleDateFormat を使用した時刻文字列が特定のデバイスで失敗し、「解析不能」というエラーが発生します。 date" エラー。

分析:

SimpleDateFormat では、日付解析の言語と文化的規則を指定するために Locale パラメーターが必要です。ロケールが指定されていない場合は、システムのデフォルトのロケールが使用されます。これにより、ロケール設定が異なるデバイスで解析の不一致が生じる可能性があります。

解決策:

  1. SimpleDateFormat インスタンスを作成するときに、目的のロケールを明示的に指定します。
  2. 最新のものを使用するSimpleDateFormat の代わりの DateTimeFormatter API。 ロケール固有の解析と書式設定を提供し、パフォーマンスと柔軟性が向上します。

詳細な説明:

指定された日付-time 文字列 (「2016 年 10 月 24 日 7:31 pm」) は英語です。ただし、システムのデフォルトのロケールが英語でない場合 (フランス語の電話の場合など)、デフォルトの SimpleDateFormat インスタンスは解析に失敗します。

Java 8 (DateTimeFormatter):

Java 8 では、明示的なロケールを指定して DateTimeFormatter を使用してカスタム日時を解析します文字列。ロケールを受け入れない事前定義されたフォーマッタの使用は避けてください。例:

DateTimeFormatter dtf = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("d MMM uuuu h:m a")
        .toFormatter(Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtf);

Java 6/7 (ThreeTen-Backport):

Java 6 または Java 7 で行き詰まった場合は、ThreeTen-Backport を使用してバックポートします。 DateTimeFormatter 機能。

追加注:

  1. エラー メッセージ「解析できない日付: "24 Oct 2016 7:31 pm" (at offset 3)」は、2 番目の文字 (「c」) が原因で解析が失敗したことを示します。 )「Oct」(オフセット 3 の文字)。これは、月名のロケール固有の違いが原因である可能性があります。
  2. 機能、パフォーマンス、一貫性の点で優れているため、すべての日付/時刻処理については最新の DateTimeFormatter API に切り替えることを強くお勧めします。 SimpleDateFormat.
との比較

以上がSimpleDateFormat が日付の解析に失敗するのはなぜですか? Locale と DateTimeFormatter を使用して修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。