[英]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 日期和时间 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 版本,默认情况下缩写不带点)。 由于您的缩写是Mon
代表Montag (星期一),我们需要提供我们自己的缩写。 这就是我通过地图所做的。 我不知道你在一周中的其他几天得到哪些缩写,所以请自己在地图中填写正确的缩写。
当然,另一种可能的解决方案是确保您获得的字符串使用 Java 的缩写。 然后你可以在你的格式模式字符串中使用EEE
,就像你的问题一样,这会使格式化程序更简单。
您的尝试存在三个问题:
EEE
需要像Mo.
这样的两个字母的月份缩写,因此不能接受Mon
。 这导致了您看到的异常。FF
表示“月中的星期几”。 所以你真的想把你的字符串解析为2021 年 5 月的第 3 个星期一,这就是为什么我问你是否期望 5 月 17 日。 小写dd
表示月份中的某一天。YY
是错误的。 大写Y
表示基于周的年份,仅对周数有用。 对于年份,您需要使用SimpleDateFormat
小写y
。 使用DateTimeFormatter
您可以在第 1 年之前的年份中使用具有不同含义的u
或y
。DateTimeFormatter
格式化模式代码中的uuuu
与yyyy
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.