将日期从DD-MMM-YYYY重新格式化为YYYYDDMM或YYYYMMDD

时间:2017-10-09 11:11:41

标签: java date java-8 java-time date-parsing

我正在尝试使用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()忽略区分大小写。

2 个答案:

答案 0 :(得分:2)

In the comments您告诉输入格式为DD-MMM-YYYYAccording 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);

我希望有所帮助。