2017-12-10 40 views
-2

私は奇妙な問題に直面しました。私はLocalDateにString値を解析できません。問題は、実行時に評価式ツールでブレークポイントを一時停止して解析を実行していることです。しかし、私は、アプリケーションを継続し、私は次の節で例外を取得:JavaでStringからLocalDateを正しく解析する方法は?

によって引き起こさ

:java.time.format.DateTimeParseException:テキストは、「-218906870-0-9088-15635」インデックス11 で解析できませんでした(DateTimeFormatter.java:1851) のjava.time.LocalDate.parse(LocalDate.java:400)でのjava.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) のjava.time.format.DateTimeFormatter.parseもっとcom.library.controller.CrudController.returnBookで) (CrudController.java:96) ... 55

私のコードはここにあります

LocalDate date = returnDatePicker.getValue(); 
    Journal item = (Journal) tableView.getSelectionModel().getSelectedItem(); 
    if(date != null && item != null) { 
     LocalDate itemDate = LocalDate.parse(item.getStartDate().toString()); 
     if (date.isAfter(itemDate)) { 
      journalDao.saveOrUpdate(item.withReturnDate(date)); 
      returnPanel.setDisable(true); 
      fillJournal(); 
     } 
    } 

文字列値の日付は "2017-12-30"のように見えます。 いくつかのスクリーンショット: When I evaluate expression I get correct result

どうすれば可能ですか?評価版で動作し、実行時には動作しません。 私はいくつかのヒントを教えていただければ幸いです。

+1

LocalDate.parse()、正常に動作する「-218906870-0-9088-15635」どこかということは明らかですあなたはそれを日付として解析しようとしています。それが例外を投げる理由です。 – prsvr

+0

@GCPこれは、行LocalDate itemDate = LocalDate.parse(item.getStartDate()。toString())で例外をスローします。 メソッドの解析をデバッグし、解析中に例外がスローされることがわかりました。しかし、私は理解できません。評価式ツールでは例外をスローしないのはなぜですか? –

+0

'item.getStartDate()'が返す値がわからないときは、その型を知らなくても、目がくらんでいるとしか推測できません。あなたは[最小限の、完全で、かつ証明可能な例を作成してください](https://stackoverflow.com/help/mcve)できますか? –

答えて

2

Stringからjava.util.Dateを鋳造し、その後LocalDateにその文字列を解析するとLocalDateDateを変換するための最良の方法ではないかもしれません。

(詳細hereに説明)以下のことを試してみて、それはあなたの問題を修正するかどうかを確認:

Date startDate = item.getStartDate(); 
ZoneId zoneId = ZoneId.systemDefault(); // Or ZoneId.of("Europe/Moscow") etc. 
LocalDate itemDate = startDate.toInstant().atZone(zoneId).toLocalDate(); 
+2

正しいですが、 'Date :: toString'を呼び出すのは間違ったアプローチです。 'java.util.Date'はUTCです。 'toString'の不幸な実装は、JVMの現在のデフォルトタイムゾーンを動的に適用します。だから、地球上のあなたの場所に応じて3つの可能な日付のいずれかを得ることができます。少なくとも26時間のタイムゾーンにわたって広がります。だから、日付を決めるには絶対にタイムゾーンが必要です。 'Date :: toString'を決して呼び出さないでください。この答え、Date :: toInstantに正しく示されているように、ただちに' java.time.Instant'に変換してください。 –

+1

解析できなかったテキストが '-218906870-0-9088-15635'だったので、' Date.toString() 'からの出力はほとんどありませんでした。 –

+2

@ OleV.V。あなたは正しいです、私とこの著者の著者は共に 'java.util.Date'が関与していると仮定しました。しかし、それは質問のエラーメッセージに埋め込まれた文字列の値が与えられているとは限りません。書かれているように、質問は不明であり、その入力文字列値の説明が欠けています。私は不明確な質問を閉じるために投票しています。 –

関連する問題