正则表达式,匹配器和DateTimeParseException:无法在索引0处解析文本'01 / 08/2018'

时间:2018-02-10 03:52:40

标签: java java-8 date-parsing localdate

我从下面的代码中收到此问题java.time.format.DateTimeParseException: Text '01/08/2018' could not be parsed at index 0。不确定我有什么其他选项来解析使用此匹配器的字符串。

    String dateString = "At 01/08/2018"
    String regex = "At (\\d{2}/\\d{2}/\\d{4})";
    Matcher mDate = Pattern.compile(regex).matcher(dateString);
    if (mDate.find()) {
        DateTimeFormatter fmt = new DateTimeFormatterBuilder()
                .appendPattern("yyyyMMddHHmmss")
                .appendValue(ChronoField.MILLI_OF_SECOND, 2)
                .toFormatter();
        LocalDate localDate = LocalDate.parse(mDate.group(1), fmt);
        order.setDate(asDate(localDate)); 
    } else {
        // fails..
    }
}

public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}

输出例如:2018-01-08T00:00:07但是这里棘手的部分是dateString没有设置那个时间所以也许DateTimeFormatterBuilder可能工作加上设置order.setDate是一个Date类型。

1 个答案:

答案 0 :(得分:2)

您不需要正则表达式 DateTimeFormatter来检查您的字符串格式是否与预期一致。你需要格式化程序来匹配预期的输入。

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("'At 'MM/dd/uuuu");
    String dateString = "At 01/08/2018";
    try {
        LocalDate localDate = LocalDate.parse(dateString, dateFormatter);
        System.out.println(localDate);
        // order.setDate(asDate(localDate));
    } catch (DateTimeParseException dtpe) {
        // fails..
    }

打印

2018-01-08

我相信你打算在1月8日;如果您打算在8月1日,请在格式模式字符串中交换MMdd

PS您的asDate可以更简单,清晰,正确地实施:

    return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());