DateTimeFormatter中的通配符

时间:2016-03-17 14:24:44

标签: java parsing java-time

我需要将字符串解析为LocalDate。该字符串在正则表达式中看起来像31.* 03 2016(即.*表示在日期编号后可能有0个或更多未知字符。)

输入/输出示例:31xy 03 2016 ==> 2016-03-31

我希望在DateTimeFormatter文档中找到一个通配符语法,以允许使用如下模式:

LocalDate.parse("31xy 03 2016", DateTimeFormatter.ofPattern("dd[.*] MM yyyy"));

但我找不到任何东西。

是否有一种简单的方法可以用DateTimeFormatter来表达可选的未知字符?

ps:我可以在解析之前修改字符串,但这不是我要求的。

2 个答案:

答案 0 :(得分:6)

java.time中没有对此的直接支持。

最接近的是使用两个不同的格式化程序来使用parse(CharSequence,ParsePosition)

// create the formatter for the first half
DateTimeFormatter a = DateTimeFormatter.ofPattern("dd")

// setup a ParsePosition to keep track of where we are in the parse
ParsePosition pp = new ParsePosition();

// parse the date, which will update the index in the ParsePosition
String str = "31xy 03 2016";
int dom = a.parse(str, pp).get(DAY_OF_MONTH);

// some logic to skip the messy 'xy' part
// logic must update the ParsePosition to the start of the month section
pp.setIndex(???)

// use the parsed day-of-month in the formatter for the month and year
DateTimeFormatter b = DateTimeFormatter.ofPattern("MM yyyy")
    .parseDefaulting(DAY_OF_MONTH, dom);

// parse the date, using the *same* ParsePosition
LocalDate date = b.parse(str, pp).query(LocalDate::from);

虽然以上是未经测试的,但基本上应该可行。但是,手动解析它会容易得多。

答案 1 :(得分:3)

我分两步完成,使用正则表达式将原始字符串转换为LocalDate可以解析的内容,例如:

String dateSource = "31xy 03 2016";
String normalizedDate = dateSource.replaceFirst("^(\\d+).*? (\\d+ \\d+)", "$1 $2");
LocalDate date = LocalDate.parse(normalizedDate, DateTimeFormatter.ofPattern("dd MM yyyy"));
System.out.println(date);

我知道这不是你要求的。