我正在尝试在 JodaTime 中构建格式化程序,以从如下字符串中解析周期:
- 年1小时90分钟
- 1年-60天800分钟
- 1年+1个月-1天+1小时-30分钟
我知道我可以在 jodatime 中使用 periodFormatterBuilder 构建解析器,但用它我无法解析前两个示例
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendYears().appendSuffix("year", "years").appendSeparatorIfFieldsAfter(" ")
.appendMonths().appendSuffix("month", "months").appendSeparatorIfFieldsAfter(" ")
.appendDays().appendSuffix("day", "days").appendSeparatorIfFieldsAfter(" ")
.appendHours().appendSuffix("hour", "hours").appendSeparatorIfFieldsAfter(" ")
.appendMinutes().appendSuffix("min", "mins").appendSeparatorIfFieldsAfter(" ")
.appendSeconds().appendSuffix("sec", "secs")
.toFormatter();
有什么方法可以告诉 joda 这些字段是可选的吗?
最佳答案
如果您确实想实现这一目标,可以通过编写自定义解析器来实现。为此,您必须实现 periodParser 类并实现 parseInto() 方法。
@Override
public int parseInto(ReadWritablePeriod period, String periodStr,
int position, Locale locale) {
String tokens[] = periodStr.split(" ");
period.addYears(0);
period.addMonths(0);
period.addDays(0);
period.addHours(0);
period.addMinutes(0);
period.addSeconds(0);
for (String token : tokens) {
int count = 0;
if (token.contains("year")) {
String years = token.substring(0, token.indexOf("year"));
period.addYears(years.length() > 0 ? Integer.valueOf(years) : 0);
continue;
}
if (token.contains("hour")) {
period.addHours(Integer.valueOf(token.substring(0, token.indexOf("hour"))));
continue;
}
if (token.contains("min")) {
period.addMinutes(Integer.valueOf(token.substring(0, token.indexOf("min"))));
continue;
}
if (token.contains("months")) {
period.addMonths(Integer.valueOf(token.substring(0, token.indexOf("months"))));
continue;
}
if (token.contains("day")) {
period.addDays(Integer.valueOf(token.substring(0, token.indexOf("days"))));
continue;
}
}
return periodStr.length();
}
之后,使用以下代码创建格式化程序并解析句点。
PeriodFormatterBuilder builder = new PeriodFormatterBuilder();
PeriodFormatter formatter = builder.append(null, new MyParsePeriod()).toFormatter();
关于java - 带有可选月份的日期时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29306036/