java.text.ParseException:无法解析的日期
java.text.ParseException: Unparsable Date
我在日志文件中有这个垃圾 DateFormat,需要解析以便比较它。
就是这样的格式。 Mon 03-Mai-21
我的尝试:
DateFormat format = new SimpleDateFormat("EEE FF-MMM-YY", Locale.GERMAN);
String test = "Mon 03-Mai-21";
Date date = null;
try {
date = format.parse(test);
} catch (ParseException e) {
e.printStackTrace();
}
我在尝试解析时收到 ParseException
,但我不知道我的模式有什么问题?
我的预期结果是 2021-05-03。
java.time
我建议您使用 java.time,现代 Java 日期和时间 API,作为您的约会工作。
为您的格式声明格式化程序:
private static Map<Long, String> dayOfWeekAbbreviations
= Map.ofEntries(
Map.entry(1L, "Mon"),
Map.entry(2L, "Die"),
Map.entry(3L, "Mit"),
Map.entry(4L, "Don"),
Map.entry(5L, "Fre"),
Map.entry(6L, "Sam"),
Map.entry(7L, "Son"));
private static final DateTimeFormatter DATE_FORMATTER
= new DateTimeFormatterBuilder()
.appendText(ChronoField.DAY_OF_WEEK, dayOfWeekAbbreviations)
.appendPattern(" dd-MMM-uu")
.toFormatter(Locale.GERMAN);
像这样解析:
String test = "Mon 03-Mai-21";
LocalDate date = LocalDate.parse(test, DATE_FORMATTER);
System.out.println(date);
输出:
2021-05-03
Java 假设星期几缩写为 Mo.、Di.、Mi.、Do.、Fr.、Sa.、So。 (至少我的 Java 11 是这样;我认为有 Java 版本的缩写默认没有点)。由于 Montag(星期一)的缩写是 Mon
,我们需要提供自己的缩写。这就是我通过地图所做的。我不知道你在一周的其他日子里得到了哪些缩写,所以请你自己将正确的缩写填入地图。
当然,另一种可能的解决方案是确保您获得的字符串使用 Java 的缩写。然后你可以像你的问题一样在你的格式模式字符串中使用 EEE
,这会使格式化程序更简单一些。
你的代码出了什么问题?
您的尝试存在三个问题:
- 正如我所说,格式模式字符串中的
EEE
需要两个字母的星期几缩写,例如 Mo.
,因此不能接受 Mon
。这导致了您看到的异常。
FF
表示“一个月中的星期几”。所以你真的试图将你的字符串解析为 2021 年 5 月的第 3 个星期一,这就是为什么我问你是否预计 5 月 17 日。小写 dd
表示一个月中的第几天。
- 年份的大写
YY
是错误的。大写 Y
用于基于周的年份,仅对周数有用。对于年份,您需要小写 y
和 SimpleDateFormat
。对于 DateTimeFormatter
,您可以使用 u
或 y
,对于第 1 年之前的年份具有不同的含义。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
我在日志文件中有这个垃圾 DateFormat,需要解析以便比较它。
就是这样的格式。 Mon 03-Mai-21
我的尝试:
DateFormat format = new SimpleDateFormat("EEE FF-MMM-YY", Locale.GERMAN);
String test = "Mon 03-Mai-21";
Date date = null;
try {
date = format.parse(test);
} catch (ParseException e) {
e.printStackTrace();
}
我在尝试解析时收到 ParseException
,但我不知道我的模式有什么问题?
我的预期结果是 2021-05-03。
java.time
我建议您使用 java.time,现代 Java 日期和时间 API,作为您的约会工作。
为您的格式声明格式化程序:
private static Map<Long, String> dayOfWeekAbbreviations
= Map.ofEntries(
Map.entry(1L, "Mon"),
Map.entry(2L, "Die"),
Map.entry(3L, "Mit"),
Map.entry(4L, "Don"),
Map.entry(5L, "Fre"),
Map.entry(6L, "Sam"),
Map.entry(7L, "Son"));
private static final DateTimeFormatter DATE_FORMATTER
= new DateTimeFormatterBuilder()
.appendText(ChronoField.DAY_OF_WEEK, dayOfWeekAbbreviations)
.appendPattern(" dd-MMM-uu")
.toFormatter(Locale.GERMAN);
像这样解析:
String test = "Mon 03-Mai-21";
LocalDate date = LocalDate.parse(test, DATE_FORMATTER);
System.out.println(date);
输出:
2021-05-03
Java 假设星期几缩写为 Mo.、Di.、Mi.、Do.、Fr.、Sa.、So。 (至少我的 Java 11 是这样;我认为有 Java 版本的缩写默认没有点)。由于 Montag(星期一)的缩写是 Mon
,我们需要提供自己的缩写。这就是我通过地图所做的。我不知道你在一周的其他日子里得到了哪些缩写,所以请你自己将正确的缩写填入地图。
当然,另一种可能的解决方案是确保您获得的字符串使用 Java 的缩写。然后你可以像你的问题一样在你的格式模式字符串中使用 EEE
,这会使格式化程序更简单一些。
你的代码出了什么问题?
您的尝试存在三个问题:
- 正如我所说,格式模式字符串中的
EEE
需要两个字母的星期几缩写,例如Mo.
,因此不能接受Mon
。这导致了您看到的异常。 FF
表示“一个月中的星期几”。所以你真的试图将你的字符串解析为 2021 年 5 月的第 3 个星期一,这就是为什么我问你是否预计 5 月 17 日。小写dd
表示一个月中的第几天。- 年份的大写
YY
是错误的。大写Y
用于基于周的年份,仅对周数有用。对于年份,您需要小写y
和SimpleDateFormat
。对于DateTimeFormatter
,您可以使用u
或y
,对于第 1 年之前的年份具有不同的含义。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.