javadateformatjava-timejava-10

Java: DateTimeFormatter fail to parse time string when seconds and milliseconds are all 0s?


Basically, I am using the following code to parse string as LocalDateTime, which works fine most of the time.

DateTimeFormatter dtformatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

However, I encounter cases where the seconds and millseconds are 00000 and this is when the parser fails and print a LocalDateTime 2018-03-01T09:16 instead of 2018-03-01T09:16:00.000.

System.out.println(LocalDateTime.parse("20180301091600000",dtformatter));

(Note that in my code, I have to parse string as LocalDateTime, do some comparison and then at the end, print LocalDateTime to csv)

How can I fix it to make it print 2018-03-01T09:16:00.000 instead of 2018-03-01T09:16 ?

FYI, I am using jdk10.


Solution

  • I'm not sure why it's not work, it seems it is a bug because when I use :

    20180301091600001        result is      2018-03-01T09:16:00.001
    ----------------^                       -----------------^^^^^^
    

    Also another test :

    2018030100000000         result is      2018-03-01T00:00
    --------^^^-----                        -----------^^^^^^^^^^^
    

    It seems that the parser ignore the seconds and millisecond when it is zero, why?

    The full explanation why?, is in the answer of Basil Bourque.


    Solution

    Here is a quick fix where you can use another formatter like this :

    var result = LocalDateTime.parse("20180301091600000", dtformatter)
                    .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss:SSS"));
    

    Output

    2018-03-01T09:16:00:000