我正在尝试使用Java 8重新格式化今天的日期,但我收到以下错误:
java.time.format.DateTimeParseException:无法解析文本'09 -OCT-2017': 无法从TemporalAccessor获取LocalDate: {WeekBasedYear [WeekFields [SUNDAY,1]] = 2017,MonthOfYear = 10,DayOfYear = 9},ISO类型为java.time.format.Parsed
代码:
public static String formatDate(String inputDate, String inputDateFormat, String returnDateFormat){
try {
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern(inputDateFormat).toFormatter(Locale.ENGLISH);
LocalDate localDate = LocalDate.parse(inputDate, inputFormatter);
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(returnDateFormat);
String formattedString = localDate.format(outputFormatter);
return formattedString;
} catch (DateTimeParseException dtpe) {
log.error("A DateTimeParseException exception occured parsing the inputDate : " + inputDate + " and converting it to a " + returnDateFormat + " format. Exception is : " + dtpe);
}
return null;
}
我之前尝试使用SimpleDateFormat
,但问题是我的inputDateFormat
格式总是大写DD-MMM-YYYY
,这给我的结果不正确,所以我尝试使用parseCaseInsensitive()
忽略区分大小写。
答案 0 :(得分:2)
In the comments您告诉输入格式为DD-MMM-YYYY
。 According to javadoc,大写DD
是一年中的一天字段,YYYY
是以年为基础的一年字段(可能是{ {3}})。
您需要将它们更改为小写dd
(日期)和yyyy
(年代)。 parseCaseInsensitive()
仅处理文本字段 - 在这种情况下,月份名称(数字不受区分大小写影响 - 只是因为月份是大写的,它不是意味着数字模式也应该是)。
其余代码是正确的。示例(将格式更改为yyyyMMdd
):
String inputDate = "09-OCT-2017";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
// use "dd" for day of month and "yyyy" for year
.appendPattern("dd-MMM-yyyy")
.toFormatter(Locale.ENGLISH);
LocalDate localDate = LocalDate.parse(inputDate, inputFormatter);
// use "dd" for day of month and "yyyy" for year
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String formattedString = localDate.format(outputFormatter);
System.out.println(formattedString); // 20171009
上面代码的输出是:
20171009
关于different from the year field关于无法控制输入模式的问题,另一种方法是手动将字母替换为小写版本:
String pattern = "DD-MMM-YYYY";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
// replace DD and YYYY with the lowercase versions
.appendPattern(pattern.replace("DD", "dd").replaceAll("YYYY", "yyyy"))
.toFormatter(Locale.ENGLISH);
// do the same for output format if needed
我认为它不需要复合替换 - 一步到位正则表达式。只需多次调用replace
方法就可以解决问题(除非您有真正复杂模式,需要对replace
进行大量不同且复杂的调用,但仅限于案例你提供的,这就足够了。
答案 1 :(得分:-1)
我希望我帮到你。 将字符串格式化为LocalDate非常简单。您的日期格式是2017年10月9日? 现在您只需要使用split命令将其划分为日,月和年:
String[] tempStr = inputDate.split("-");
int year = Integer.parseInt(tempStr[2]);
int month = Integer.parseInt(tempStr[1]);
int day = Integer.parseInt(tempStr[0]);
之后很容易得到LocalDate:
LocalDate ld = LocalDate.of(year, month, day);
我希望有所帮助。