DateTimeFormatter 中的通配符

2024-05-07

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

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

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

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

但我找不到任何东西。

有没有一种简单的方法来表达可选的未知字符DateTimeFormatter?

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


对此没有直接支持java.time.

最接近的是使用解析(字符序列,解析位置) http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#parse-java.lang.CharSequence-java.text.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);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DateTimeFormatter 中的通配符 的相关文章

随机推荐