2016-04-09 10 views
2

以下のコードは例外です。例外..ここで何か間違っていますか?年が停止しようとしている場合、パーサーは知りませんuuuuと上記のコメントで述べたJon SkeetとしてJava 8のLocalDateTimeとDateTimeFormatter

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(
             "ddMMuuuuHHmmssSSS" 
            );  
    String currentTime=FORMATTER.format(LocalDateTime.now()); 
    System.out.println(currentTime); 
    LocalDateTime parsedTime=LocalDateTime.parse(currentTime,FORMATTER); 


09042016161444380 
Exception in thread "main" java.time.format.DateTimeParseException: Text '09042016161444380' could not be parsed at index 4 
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) 
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) 
at java.time.LocalDateTime.parse(LocalDateTime.java:492) 
+3

I * suspect *問題は、パーサーが年をどこで止めるのか分からないことです.2016年ではなく20161年になる可能性があります。日付と時刻の部分の間に ''T ''を追加すると、働く個人的には可能な限りISO-8601フォーマットを使用することを強くお勧めします... –

+0

Jonに感謝しますがパーサーはその年が4文字であるので、2016年に終了する必要があります。 – Krishan

+3

@Krishan no、not正確に。 4以上は文字通り年を解釈することを意味するので、将来はかなり遠い2016161444380と解釈されます。 –

答えて

2

。これは、2つ以上のu'sまたはy'sがパーサーによって文字通り解釈されるためです。 YearのJavaDocをから

:パターン文字の数が2つ以上ある場合

は、解析のために、今年は、桁数に関係なく、文字どおりに解釈されます。だから、「MM/DD/YYYY」は「01/11/12」は1月11日、12 ADしたがって

に解析し、あなたがのようにddMMuuuuHHmmssSSSからddMMuuHHmmssSSSまたはddMMyyHHmmssSSSに変更した場合、それが正常に動作する必要があり、パターンを使用してこの例ではパーサは正確にどこを停止するかを知っています。

関連する問題