HOWTO · Java

Java.Text.ParseException: Java の解析不能な日付エラーを修正します。

このチュートリアルでは、Java の java.text.ParseException: Unparseable date エラーについて説明します。

このチュートリアルでは、Java の java.text.ParseException: Unparseable date エラーについて説明します。

Java の java.text.ParseException: Unparseable date エラーを修正

エラー java.text.ParseException: Unparseable date は通常、Java で SimpleDateFormat クラスを使用しているときに発生します。 このクラスは、Java で日付をフォーマットするために使用されます。

ほとんどの場合、java.text.ParseException: Unparseable dateというエラーは、文字列の日付を別の目的の日付形式に変換しようとすると発生します。 このエラーの原因となる日付文字列には、主に次の 3つの問題があります。

誤った日付形式を使用する場合

日付を目的の形式に解析する際、日付形式は非常に重要です。 Java では日付の大文字と小文字が区別されるため、すべての要素が大文字と小文字を区別する必要があります。

次の表は、日付の各要素の正しい構文を示しています。

名前 構文
Day dd
Month MM
Year yyyy
Hour HH
Minute mm
Second ss

上記の表によると、Java での日付の正しい形式は次のようになります。

SimpleDateFormat DemoDateFormat = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss");

間違ったローカリゼーションを使用する場合

ローカリゼーションは、Java で日付を記述する際のもう 1つの重要な要素です。 日付を英語のロケールに置き、それを英語以外の別のシステムで解析しようとすると、java.text.ParseException: Unparseable date エラーがスローされます。

他のシステムでデータを解析する際に問題がないように、ロケールを日付形式で指定する必要があります。 指定しない場合、JVM はデフォルトのロケールを使用するためです。

ロケール構文の例を次に示します。

SimpleDateFormat DemoDateFormat = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss", Locale.English);

間違ったタイムゾーンを使用する場合

Java で日付形式を記述する際には、正しいタイムゾーンを使用することも重要です。 SimpleDateFormat クラスは、フォーマットで指定されていない場合、JVM の現在のタイムゾーンであるデフォルトのタイムゾーンを使用するようにプログラムされています。

JVM タイムゾーンはユーザーの場所に基づいて変更される可能性があるため、この場合タイムゾーンを設定しないと、間違った形式や予期しないエラーなどのエラーが発生します。

Java でタイムゾーンを設定する構文は次のとおりです。

DemoDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Java で java.text.ParseException: Unparseable date エラーをスローする例を試してみましょう。

package delftstack;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Example {
  public static void main(String[] arg) throws ParseException {
    String DemoDate = "Tue Aug 16 12:30:10 IST 2022";
    SimpleDateFormat Simple_Date_Format = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
    Date Current_Date;
    Current_Date = Simple_Date_Format.parse(DemoDate);
    System.out.println(Current_Date);
  }
}

上記のコードの日付パターンは入力文字列に対応していないため、次のエラーがスローされます。

Exception in thread "main" java.text.ParseException: Unparseable date: "Tue Aug 16 12:30:10 IST 2022"
    at java.base/java.text.DateFormat.parse(DateFormat.java:399)
    at delftstack.Example.main(Example.java:13)

指定された文字列による正しい日付形式のソリューションは次のとおりです。

package delftstack;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Example {
  public static void main(String[] arg) throws ParseException {
    String DemoDate = "Tue Aug 16 12:30:10 IST 2022";
    SimpleDateFormat Simple_Date_Format =
        new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
    Date Current_Date;
    Current_Date = Simple_Date_Format.parse(DemoDate);
    System.out.println(Current_Date);
  }
}

コードの出力は次のとおりです。

Tue Aug 16 15:30:10 PKT 2022

与えられた出力がうまく見えない場合は、別の SimpleDateFormat を追加して、選択に従って Current_Date をフォーマットできます。 例を参照してください:

package delftstack;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Example {
  public static void main(String[] arg) throws ParseException {
    String DemoDate = "Tue Aug 16 12:30:10 IST 2022";
    SimpleDateFormat Simple_Date_Format =
        new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
    Date Current_Date;
    Current_Date = Simple_Date_Format.parse(DemoDate);

    SimpleDateFormat Print_Date = new SimpleDateFormat("EE MMM d, yyyy HH:mm:ss");
    System.out.println(Print_Date.format(Current_Date));
  }
}

上記のコードは、日付をより読みやすい形式で出力します。 出力を参照してください:

Tue Aug 16, 2022 15:30:10