2017-02-21 18 views
3

次のコードに従って日付を解析しようとしていますが、例外が発生しています。日付の解析中に予期しない例外が発生しました

java.text.ParseException: Unparseable date: "23-Jan-2017" 
    at java.text.DateFormat.parse(DateFormat.java:357) 
    at DateTest.main(DateTest.java:18) 

親切に私は問題の特定に役立つ:

public class DateTest { 
    public static void main(String args []) { 
     String start = "23-Jan-2017"; 
     DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy hh:mm a"); 

     try { 
      Date parsedDate = dateFormatTripStartDate.parse(start); 
      System.out.println(parsedDate); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

例外 - 以下のコードです。ありがとう。

+0

使用する形式は、解析する文字列の形式と一致する必要があります。 –

+1

1人のユーザーからの[MCVE](http://stackoverflow.com/help/mcve)私はYESと言う! +1 –

+0

おもしろいことに、あなたはそれを逆にするかもしれません:文字列は日付の後に余分な文字を含んでいるかもしれません、それらはちょうど無視されます。しかし、文字列は、書式パターンで必要な文字列よりも短くすることはできません。 –

答えて

4

あなたのパターンでパートタイムを削除します。すべての

DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy"); 
+0

逆の動作は、 'String date'にはtime部分を持ちますが、' String'を解析するために使用されるパターンであるためパターンにはありません – AxelH

0

まず、kamehl23からの答えは正しいです。あなたの解析された文字列は、formatで指定されたparstを紛失していない可能性がありますので、フォーマットをDateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");に変更する必要があります。 Sensible pre Java 8のオプションは、
Apache FastDateFormatおよび
joda-timeパッケージです。
どちらもいくつかの問題がありますが、確かにはるかに良いでしょうSimpleDateFormat(Joda-timeパッケージは非常に人気です)。
Java 8では、新しい日付と時刻のハングリングがパッケージjava.time.formatで導入されました。調整に時間がかかりますが、それはすばらしく機能し、その領域にあった多くの問題を解決します。クラスDateTimeFormatterを参照してください。
最後に、私はかつて任意の形式のStringをとり、可能であればDateに解析しようとするユーティリティを書く必要がありました。私はそのユーティリティをどのように実装したかを記述した記事を書いた。私はJava 8で書いたが、そのアイデアはどのバージョンでも実装できる。 Java 8 java.time package: parsing any string to date

0

パターン「dd-MMM-yyyy hh:mm a」を使用しています。しかし、実際の "hh:mm a"部分は、 "201年2月23日"の値には存在しません。このため、parse関数は文字列の日付を解析できません。

パターンをあなたの日付文字列に一致する "dd-MMM-yyyy"に変更してください。これにより、取得している例外が削除されます。

2

TL; DR java.timeを

他の回答を使用

LocalDate.parse( 
    "23-Jan-2017" , 
    DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US) 
) 

パターン不整合入力データをフォーマットについて正しいです。しかし、質問とそれ以外の回答は古くなっています。

最新の方法は、面倒な古い日時クラスに取って代わるjava.timeクラスです。

LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US); 
LocalDate ld = LocalDate.parse("23-Jan-2017" , f); 

ld.toString():2017年1月23日

それは月の名前を変換するために使用され、人間の言語を決定してLocaleを指定します。省略すると、JVMの現在のデフォルトのLocaleが暗黙的に使用されます。そのデフォルトは、JVM内の任意のアプリケーションの任意のスレッドの任意のコードによっていつでも変更することができるので、頼りにしないでください。java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuarter、およびfzmoreなどの便利なクラスがあります。

関連する問題