web-dev-qa-db-ja.com

java.text.ParseException:解析不能な日付

次のコードを試しているときに解析例外が発生します。

    String date="Sat Jun 01 12:53:10 IST 2013";
    SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
    Date currentdate;
    currentdate=sdf.parse(date);
    System.out.println(currentdate);

例外:

スレッド「main」の例外Java.text.ParseException:解析不能な日付:com.ibm.icu.text.DateFormat.parse(DateFormat.Java:510)の「Sat Jun 01 12:53:10 IST 2013」

入力:Sat Jun 01 12:53:10 IST 2013

期待される出力:Jun 01,2013 12:53:10

これを解決するには?

43
Ami

あなたのパターンは入力文字列にまったく対応していません...それが機能しないことは驚くことではありません。これはおそらくよりうまくいくでしょう:

SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
                                            Locale.ENGLISH);

次に、必要な形式で印刷するには、2番目のSimpleDateFormatが必要です。

Date parsedDate = sdf.parse(date);
SimpleDateFormat print = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
System.out.println(print.format(parsedDate));

ノート:

96
assylias
        String date="Sat Jun 01 12:53:10 IST 2013";
        SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
        Date currentdate=sdf.parse(date);
        SimpleDateFormat sdf2=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
        System.out.println(sdf2.format(currentdate));

パターンが間違っています

    String date="Sat Jun 01 12:53:10 IST 2013";
    SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
    Date currentdate;
    currentdate=sdf.parse(date);
    System.out.println(currentdate);
3
Suresh Atta

形式を次のように更新します。

SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
2
Juned Ahsan
  • 他の回答で指摘されているように、書式設定パターンは入力文字列と一致しません。
  • 入力形式はひどいです。
  • 何年も前にJava.timeクラスに取って代わられた、面倒な古い日時クラスを使用しています。

ISO 8601

そのような形式ではなく、 ISO 8601 標準形式を使用して、日時値をテキストとして交換します。

Java.timeクラスは、文字列の解析/生成時にデフォルトで標準ISO 8601形式を使用します。

適切なタイムゾーン名

continent/regionAmerica/MontrealAfrica/Casablancaなど、 適切なタイムゾーン名Pacific/Aucklandの形式で指定します。 ESTISTなどの3〜4文字の略語は、notの真のタイムゾーンであり、標準化されておらず、一意(!)でもないため使用しないでください。

ISTは、アイスランド標準時インド標準時アイルランド標準時などを意味します。 Java.timeクラスは、このあいまいさに対する論理的な解決策がないため、単に推測するだけです。

Java.time

最新のアプローチでは、Java.timeクラスを使用します。

入力文字列に一致するフォーマットパターンを定義します。

String input = "Sat Jun 01 12:53:10 IST 2013";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

zdt.toString():2013-06-01T12:53:10Z [Atlantic/Reykjavik]

入力がアイスランド向けでない場合は、文字列を事前解析して適切なタイムゾーン名に調整する必要があります。たとえば、入力がインド向けであることが確実な場合は、ISTAsia/Kolkataに変更します。

String input = "Sat Jun 01 12:53:10 IST 2013".replace( "IST" , "Asia/Kolkata" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

zdt.toString():2013-06-01T12:53:10 + 05:30 [アジア/コルカタ]


Java.timeについて

Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendar 、および SimpleDateFormat などの厄介な古い legacy 日時クラスに取って代わります。

メンテナンスモード になった Joda-Time プロジェクトは、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列やJava.sql.*クラスは必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。ここでは、 IntervalYearWeekYearQuarter 、および more

2
Basil Bourque

解析エラーなしで現在の日付を取得する簡単な解決策を見つけました。

Calendar calendar;
calendar = Calendar.getInstance();
String customDate = "" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
1
Anand Savjani
String date="Sat Jun 01 12:53:10 IST 2013";

SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");

このパターンは、集計しない入力文字列であり、これはexceptionになります。

作業を完了するには、次のpatternを使用する必要があります。

E MMM dd HH:mm:ss z yyyy

次のコードは、例外をスキップするに役立ちます。

SimpleDateFormat使用済みです。

    String date="Sat Jun 01 12:53:10 IST 2013"; // Input String

    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Existing Pattern

    Date currentdate=simpleDateFormat.parse(date); // Returns Date Format,

    SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); // New Pattern

    System.out.println(simpleDateFormat1.format(currentdate)); // Format given String to new pattern

    // outputs: Jun 01,2013 12:53:10
1
Dulith De Costa

パターン(DD-MMM-YYYY)とparse( "29-11-2018")メソッドの入力を確認してください。解析メソッドへの入力は、DD-MMM-YYYY i、eに従う必要があります。 2019年8月21日

私のコードで:

String pattern = "DD-MMM-YYYY";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

    try {
        startDate = simpleDateFormat.parse("29-11-2018");// here no pattern match 
        endDate = simpleDateFormat.parse("28-AUG-2019");// Ok 
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
0
Avinash Khadsan