Home > Enterprise >  Parse LocalDate but DateTimeParseException, dd-MMM-uuuu
Parse LocalDate but DateTimeParseException, dd-MMM-uuuu

Time:11-07

I am trying to convert a String to LocalDate using DateTimeFormatter, but I receive an exception:

java.time.format.DateTimeParseException: Text '2021-10-31' could not be parsed at index 5

My code is

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-uuuu");
String text = "2021-10-31";
LocalDate date = LocalDate.parse(text, formatter);

What am I doing wrong?

CodePudding user response:

Whats wrong?

What Am I doing wrong in my code.

Your code specifies the pattern dd-MMM-uuuu, but you attempt to parse the text 2021-10-31 which does not fit this pattern at all.

The correct pattern for your string would be yyyy-MM-dd. See the documentation of the formatter for details.

In particular, watch the order of the days and months dd-MMM vs MM-dd. And the amount of months MMM. A string matching your current pattern would be 31-Oct-2021.


Change pattern

From the comments:

my input date is - 2021-10-31 need to covert into - 31-Oct-2021

You can easily change the pattern of the date by:

  1. Parsing the input date using the pattern yyyy-MM-dd
  2. and then format it back to string using the pattern dd-MMM-yyyy.

In code, that is:

DateTimeFormatter inputPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter outputPattern = DateTimeFormatter.ofPattern("dd-MMM-yyyy");

String input = "2021-10-31";
LocalDate date = LocalDate.parse(text, inputPattern);

String output = date.format(outputPattern);

CodePudding user response:

You do not need to use a DateTimeFormatter to parse your input string

The modern Date-Time API is based on ISO 8601 and does not require using a DateTimeFormatter object explicitly as long as the Date-Time string conforms to the ISO 8601 standards. Note that your date string is already in ISO 8601 format.

You need a DateTimeFormatter just to format the LocalDate obtained by parsing the input string.

Demo:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.parse("2021-10-31");
        System.out.println(date);

        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("dd-MMM-uuuu", Locale.ENGLISH);
        System.out.println(date.format(dtfOutput));
    }
}

Output:

2021-10-31
31-Oct-2021

ONLINE DEMO

Make sure to use Locale when using a DateTimeFormatter. Check Never use SimpleDateFormat or DateTimeFormatter without a Locale to learn more about it.

Learn more about the modern Date-Time API* from Trail: Date Time.


* If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8 APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time. Check this answer and this answer to learn how to use java.time API with JDBC.

  • Related