解析 LocalDate 但得到 DateTimeParseException; dd-MMM-uuuu
Parsing LocalDate but getting DateTimeParseException; dd-MMM-uuuu
我正在尝试使用 DateTimeFormatter
将 String
转换为 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-MMM
与 MM-dd
。以及月数MMM
。匹配您当前模式的字符串将是 31-Oct-2021
.
改变模式
来自评论:
my input date is - 2021-10-31 need to covert into - 31-Oct-2021
您可以通过以下方式轻松更改日期模式:
- 使用模式
yyyy-MM-dd
解析输入日期
- 然后使用
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);
您不需要使用 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
确保在使用 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。
我正在尝试使用 DateTimeFormatter
将 String
转换为 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-MMM
与 MM-dd
。以及月数MMM
。匹配您当前模式的字符串将是 31-Oct-2021
.
改变模式
来自评论:
my input date is - 2021-10-31 need to covert into - 31-Oct-2021
您可以通过以下方式轻松更改日期模式:
- 使用模式
yyyy-MM-dd
解析输入日期
- 然后使用
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);
您不需要使用 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
确保在使用 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。