将日期从 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 进行大量不同且复杂的调用,但是只有您提供的案例就足够了。