2017-11-17 2 views
0

イムタイムゾーンで新しい日付にタイムゾーンのない日付文字列を解析しようとしているが、イムは、エラーを取得:
java.text.ParseException: Unparseable date: "2017-11-17 10:49:39.772 "SimpleDateFormatから「Unparseable date」というエラーが表示されるのはなぜですか?

Here's私のコード:

String date = "2017-11-17 10:49:39.772 " 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z"); 
sdf.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam")); 
sdf.parse(date); //here´s the error 
return date.getTime(); 

任意の提案は?

+0

日付文字列の最後にスペースがありますか?ただ疑問に思う。もちろん、それはまだ解析することができます。 –

+0

あなたのコードはコンパイルされますか? 'date'は' String'と宣言され、 'String'は' getTime'メソッドを持たないが、最後のコード行はそれを呼び出そうとします。 –

+0

'SimpleDateFormat'をまだ使用している理由は何ですか?私はそれが古くから考えており、Stack Overflowに関する質問の数から判断すると、多くの人にトラブルを引き起こしています。 'java.time'は、JSR-310とも呼ばれる近代的なJavaの日時APIです。 –

答えて

2

あなた質問は既に答えられている。私はあなたのコードの現代版を提供したがっています。

java.time

あなたは長い時代遅れのクラスSimpleDateFormatDateを使用しています。 java.timeは、JSR-310としても知られている近代的なJavaの日付と時刻のAPIは、一般的に非常に使い勝手が良いです。あなたの特定のケースでは、コードはかなり似ています

String date = "2017-11-17 10:49:39.772 "; 
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS "); 
    ZoneId zid = ZoneId.of("Europe/Amsterdam"); 
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid); 
    System.out.println(zdt); 

これは私が@DarrenWはすでに言ったことを繰り返す必要はありません

2017-11-17T10:49:39.772+01:00[Europe/Amsterdam] 

出力します。あなたの入力文字列がスペースと時間がないオフセットに終了した場合、その後にZZはUTCからのオフセットと一致しているため、フォーマットパターン文字列もスペースで終わる必要があります(これはとにかく繰り返しました)。

Dateとは逆に、ZonedDateTimeにはタイムゾーンがあります(名前が示すように)、これはあなたの要件をよりよく満たすと考えていました。お電話date.getTime()は、私00:00:00 GMTを使用すると、1970年1月1日からのミリ秒数後にしている印象を与えた(:それは憶測かもしれエポック

からのミリ秒を取得

"エポック")。その場合は、操作を行います。

long millisSinceEpoch = zdt.toInstant().toEpochMilli(); 

結果は文字列にタイムゾーンoffestで

もっと憶測を解析

1510912179772 

、私は考えて助けることができなかったが何であるかをがちょうどかもしれませんが発生しました。フォーマットパターンの文字列と一致する日付時刻文字列を受け取ったが、タイムゾーンのオフセットが間違っていたあなたのストリングの終わりに。これがそうであった場合は、近代的なAPIはちょうど解析中​​にオフセット間違っを無視することによって、より簡単かつエレガントな状況に対処することができます

String date = "2017-11-17 10:49:39.772 +0000"; 
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS Z"); 
    ZoneId zid = ZoneId.of("Europe/Amsterdam"); 
    ZonedDateTime zdt = LocalDateTime.parse(date, dtf).atZone(zid); 

は結果が、再び上記の最初のスニペットからと全く同じ2017-11-17T10:49:39.772+01:00[Europe/Amsterdam]です。 LocalDateTimeは、タイムゾーンやオフセット情報のない日時であるため、文字列からのオフセットが不正確になることはありません。とにかくatZone()は、正しいタイムゾーンを設定しています。

これを取得するもう1つの方法は、ZonedDateDateに解析し、そのwithZoneSameLocal()を呼び出して不要なオフセットを取り除くことです。

1

SimpleDateFormatには、最後にタイムゾーンオフセット(Zパラメータ)が必要ですが、文字列にはオフセットがありません。最後に+0000のようなものが必要です。

1

あなたは、文字列を正しく解析することにしたい場合は、それはあなたがコンストラクタ内に指定されてSimpleDateFormatパターンと一致する必要があります。

旧行:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z"); 

新ライン:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS "); 
関連する問題