解析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/ddmm/yy都是有效格式。 如果我给你字符串02/11 ,哪一个应该优先?

一旦确定了有效格式,就应该使用DateTimeFormatter为每个格式创建一个DateTimeFormatter 。 然后你可以使用每个格式化程序来尝试parseInto一个MutableDateTime 。 然后,遍历MutableDateTime每个字段并将值传输到Partial

不幸的是,在Joda库中没有更好的方法来处理这个问题。

ISODateTimeFormat类允许部分打印。 正如您所说, DateTimeFormatter上没有解析方法(尽管您可以解析为LocalDate并解释它)。

ThreeTen / JSR-310具有替换PartialDateTimeFields类。 支持将partials解析为CalendricalMerger ,但是可能无法将其转换回DateTimeFields