R111
R111

Reputation: 171

Convert String to LocalDateTime Java 8

I'm trying to convert the following String into a LocalDateTime:

String dateStr = "2020-08-17T10:11:16.908732"; 

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnn");
LocalDateTime dateTime = LocalDateTime.parse(dateStr, format);

But I'm hitting the following error:

java.time.format.DateTimeParseException: Text '2020-08-17T10:11:16.908732' could not be parsed at index 10
    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)

Can anyone please help to advise how I should be correctly formatting the string into a LocalDateTime?

Many thanks

Upvotes: 3

Views: 13291

Answers (2)

deHaar
deHaar

Reputation: 18588

You don't need to specify a DateTimeFormatter in this case because the default one will be used if you don't pass one at all:

public static void main(String[] args) {
    String dateStr = "2020-08-17T10:11:16.908732";
    // the following uses the DateTimeFormatter.ISO_LOCAL_DATE_TIME implicitly
    LocalDateTime dateTime = LocalDateTime.parse(dateStr);
    System.out.println(dateTime);
}

That code will output 2020-08-17T10:11:16.908732.

If you are insisting on using a custom DateTimeFormatter, consider the T by single-quoting it in the pattern and don't use nanosecond parsing (n) for parsing fractions of second (S), the result might be wrong otherwise.

Do it like this:

public static void main(String[] args) {
    String dateStr = "2020-08-17T10:11:16.908732"; 
    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS");
    LocalDateTime dateTime = LocalDateTime.parse(dateStr, format);
    System.out.println(dateTime);
}

with the same output as above.

Note:
The result of using the pattern "yyyy-MM-dd'T'HH:mm:ss.nnnnnn" would not be equal to the parsed String, instead, it would be

2020-08-17T10:11:16.000908732

Upvotes: 6

Gaurav Jeswani
Gaurav Jeswani

Reputation: 4592

For your given DateTime string pattern should be updated "yyyy-MM-dd'T'HH:mm:ss.nnnnnn".

So the code should be like :

String dateStr = "2020-08-17T10:11:16.908732"; 

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnn");
LocalDateTime dateTime = LocalDateTime.parse(dateStr, format);

For more details around it you can refer JavaDoc.

Along that in your given input DateTime it's using 6 digits, so it can't be nano seconds. Because nano is 1/1000000000. So it will have at least 9 digits. So the correct format rather should be second fraction with 6 digits as "yyyy-MM-dd'T'HH:mm:ss.SSSSSS".

End Results comparison:

With Pattern : "yyyy-MM-dd'T'HH:mm:ss.nnnnnn"

System.out.println(LocalDateTime.parse("2020-08-17T10:11:16.908732", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnn")));

Output : 2020-08-7T10:11:16.000908732

With Pattern : "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"

System.out.println(LocalDateTime.parse("2020-08-17T10:11:16.908732", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS")));

Output : 2020-08-7T10:11:16.908732

Upvotes: 1

Related Questions