解析 LocalDate 但得到 DateTimeParseException; dd-MMM-uuuu

Parsing LocalDate but getting DateTimeParseException; dd-MMM-uuuu

我正在尝试使用 DateTimeFormatterString 转换为 LocalDate,但我收到一个异常:

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

我的密码是

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

我正在尝试将输入日期 2021-10-31 转换为 31-Oct-2021

怎么了?

What Am I doing wrong in my code.

您的代码指定了模式 dd-MMM-uuuu,但您试图解析根本不符合该模式的文本 2021-10-31

您的字符串的正确模式是 yyyy-MM-dd。有关详细信息,请参阅格式化程序的documentation

特别注意日期和月份的顺序 dd-MMMMM-dd。以及月数MMM。匹配您当前模式的字符串将是 31-Oct-2021.


改变模式

来自评论:

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

您可以通过以下方式轻松更改日期模式:

  1. 使用模式 yyyy-MM-dd
  2. 解析输入日期
  3. 然后使用 dd-MMM-yyyy.
  4. 模式将其格式化回字符串

在代码中,即:

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);

您不需要使用 DateTimeFormatter 来解析您的输入字符串

现代日期时间 API 基于 ISO 8601 并且不需要明确使用 DateTimeFormatter 对象,只要日期时间字符串符合 ISO 8601 标准.请注意,您的日期字符串已采用 ISO 8601 格式。

你需要一个DateTimeFormatter来格式化解析输入字符串得到的LocalDate

演示:

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));
    }
}

输出:

2021-10-31
31-Oct-2021

ONLINE DEMO

确保在使用 DateTimeFormatter 时使用 Locale。检查 Never use SimpleDateFormat or DateTimeFormatter without a Locale 以了解更多信息。

详细了解 modern Date-Time API* from Trail: Date Time


* 如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time. Check this answer and this answer 学习如何使用 java.time API 和 JDBC。