日期时间,可选月份

时间:2015-03-27 16:53:36

标签: java parsing datetime format jodatime

我正在尝试在JodaTime中构建格式化程序,以便从这些字符串中解析Period:

  • 年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田地是可选的吗?

1 个答案:

答案 0 :(得分:1)

如果您真的希望实现这一点,可以通过编写自定义解析器来实现。为此,您必须实现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();