Java – convert simpledateformat to datetimeformatter
Therefore, when trying to replace some legacy code with simpledateformat and date, use Java time. Datetimeformatter and localdate, I have a problem The two date formats are different At this point, I must say that I know the two date types are different, but my situation means that I never care about time, so I can ignore it
public Date getDate(String value) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); try { return dateFormat.parse(value); } catch (ParseException e) { return null; } } public LocalDate getLocalDate(String value) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); try { return LocalDate.parse(value,formatter); } catch (DateTimeParseException e) { return null; } } public void testDates() { getDate("03/07/2016"); // Sun Jul 03 00:00:00 BST 2016 getDate("3/7/2016"); // Sun Jul 03 00:00:00 BST 2016 getDate("3/7/2016 00:00:00"); // Sun Jul 03 00:00:00 BST 2016 getDate("3/7/2016 00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016 getDate("3/7/2016T00:00:00.0+0100"); // Sun Jul 03 00:00:00 BST 2016 getLocalDate("03/07/2016"); // 2016-07-03 getLocalDate("3/7/2016"); // null getLocalDate("3/7/2016 00:00:00"); // null getLocalDate("3/7/2016 00:00:00.0+0100"); // null getLocalDate("3/7/2016T00:00:00.0+0100"); // null }
As you can see, when the same pattern is used in two formatters, the datetimeformatter will eventually generate a null value, and the date you want to see is equal to the date of SDF In this case, I want to discard unnecessary data, but this is not the case
So how do we create a powerful date / time parser?!
Solution
So there may be other answers, but my method is to cater to my most extreme situation First, I reduce DD / mm to D / m. This represents the minimum number of characters expected, so the two digits will be fully parsed Note that you can also use the new datetimeformatterbuilder() Parselenient(), but this seems unnecessary
Second, I decided to use optional clauses in the format schema itself This allows you to specify which parts may not be provided, which is what I am trying to solve
Leave us:
DateTimeFormatter.ofPattern("d/M/yyyy[' ']['T'][H:mm[:ss[.S]]][X]");
Now, this will handle dates with or without time, including t delimiters, seconds, milliseconds, and area offsets
Good luck, it helps others!
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy[' ']['T'][H:mm[:ss[.S]]][X]"); public LocalDate getRobustLocalDate(String value) { try { return LocalDate.parse(value,formatter); } catch (DateTimeParseException e) { return null; } } @Test public void testDates() { getRobustLocalDate("03/07/2016"); // 2016-07-03 getRobustLocalDate("3/7/2016"); // 2016-07-03 getRobustLocalDate("3/7/2016 00:00:00"); // 2016-07-03 getRobustLocalDate("3/7/2016 00:00:00.0+0100"); // 2016-07-03 getRobustLocalDate("3/7/2016T00:00:00.0+0100"); // 2016-07-03 }