4

我正在尝试将 a 转换StringLocalDateusing DateTimeFormatter,但收到异常:

java.time.format.DateTimeParseException:无法在索引 5 处解析文本“ 2021-10-31 ”

我的代码是

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

我正在尝试从输入日期转换2021-10-3131-Oct-2021.

4

2 回答 2

6

怎么了?

我在我的代码中做错了什么。

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

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

特别是,注意日期和月份dd-MMMMM-dd. 又额月MMM。与您当前模式匹配的字符串将是31-Oct-2021.


改变模式

从评论:

我的输入日期是 - 2021-10-31 需要转换为 - 2021 年 10 月 31 日

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

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

在代码中,即:

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);
于 2021-11-06T23:02:53.343 回答
4

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

现代日期时间 API 基于ISO 8601DateTimeFormatter ,只要日期时间字符串符合 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

Locale使用时请务必使用DateTimeFormatter. 选中Never use SimpleDateFormat or DateTimeFormatter without a Locale以了解更多信息。

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供java.time. 检查此答案此答案以了解如何将java.timeAPI 与 JDBC 一起使用。

于 2021-11-06T23:23:47.003 回答