将日期从 DD-MMM-YYYY 重新格式化为 YYYYDDMM 或 YYYYMMDD
Reformatting a Date from DD-MMM-YYYY to YYYYDDMM or YYYYMMDD
我正在尝试使用 Java 8 重新格式化今天的日期,但出现以下错误:
java.time.format.DateTimeParseException: Text '09-OCT-2017' could not be parsed:
Unable to obtain LocalDate from TemporalAccessor:
{WeekBasedYear[WeekFields[SUNDAY,1]]=2017, MonthOfYear=10, DayOfYear=9},ISO of type 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
,这给了我不正确的结果,所以我尝试使用 [=14] =] 忽略区分大小写。
希望我没听错。
将 String 格式化为 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);
希望对您有所帮助。
you told that the input format is DD-MMM-YYYY
. According to javadoc, uppercase DD
is the day of year field, and YYYY
is the week based year field (which might be ).
您需要将它们更改为小写 dd
(月中的某天)和yyyy
(纪元的年份). parseCaseInsensitive()
只处理 text 字段 - 在这种情况下,月份名称(数字不受区分大小写的影响 - 因为月份是大写的,它并不意味着数字模式也应该是)。
其余代码正确。示例(将格式更改为 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
关于无法控制输入模式,一种替代方法是手动将字母替换为小写版本:
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
进行大量不同且复杂的调用,但是只有您提供的案例就足够了。
我正在尝试使用 Java 8 重新格式化今天的日期,但出现以下错误:
java.time.format.DateTimeParseException: Text '09-OCT-2017' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2017, MonthOfYear=10, DayOfYear=9},ISO of type 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
,这给了我不正确的结果,所以我尝试使用 [=14] =] 忽略区分大小写。
希望我没听错。 将 String 格式化为 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);
希望对您有所帮助。
DD-MMM-YYYY
. According to javadoc, uppercase DD
is the day of year field, and YYYY
is the week based year field (which might be
您需要将它们更改为小写 dd
(月中的某天)和yyyy
(纪元的年份). parseCaseInsensitive()
只处理 text 字段 - 在这种情况下,月份名称(数字不受区分大小写的影响 - 因为月份是大写的,它并不意味着数字模式也应该是)。
其余代码正确。示例(将格式更改为 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
关于
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
进行大量不同且复杂的调用,但是只有您提供的案例就足够了。