解析Joda-Time Partials
我想从Strings中生成Partials,但在支持它的API中找不到任何内容。 显然,我可以在Joda-Time框架之外编写自己的解析器并创建Partials,但我无法想象API还没有能力做到这一点。
使用threeten(JSR-310)将是一个可接受的解决方案,但它似乎不支持Partials。 我不知道这是由于它的alpha状态,还是部分概念是否以不同的方式处理,我还没有发现。
将String(2011,02 / 11等)转换为Partial的最佳方法是什么?
我扩展了DateTimeParserBucket。 我的扩展类拦截对saveField()方法的调用,并在委托给super之前存储字段类型和值。 我还实现了一个使用这些存储的字段值来创建Partial的方法。
我能够将我的存储桶实例传递给DateTimeParser.parseInto(),然后让它创建Partial。
它有效,但我不能说我对Joda-Time印象深刻 – 因为它不支持开箱即用解析Partials。 缺少DateTimeFormatter.parsePartial(String)是一个明显的遗漏。
您必须首先定义您将接受的Partials的有效格式。 没有类只会采用文本并推断出Partial的最佳匹配。 根据区域设置,用户偏好等方式来说,它太主观了。因此无法绕过所有输入的有效格式列表。 要使这些相互排斥是非常困难的,所以应该有优先事项。 例如,您可能希望mm/dd
和mm/yy
都是有效格式。 如果我给你字符串02/11
,哪一个应该优先?
一旦确定了有效格式,就应该使用DateTimeFormatter
为每个格式创建一个DateTimeFormatter
。 然后你可以使用每个格式化程序来尝试parseInto
一个MutableDateTime
。 然后,遍历MutableDateTime
每个字段并将值传输到Partial
。
不幸的是,在Joda库中没有更好的方法来处理这个问题。
ISODateTimeFormat
类允许部分打印。 正如您所说, DateTimeFormatter
上没有解析方法(尽管您可以解析为LocalDate
并解释它)。
ThreeTen / JSR-310具有替换Partial
的DateTimeFields
类。 支持将partials解析为CalendricalMerger
,但是可能无法将其转换回DateTimeFields
。