【问题标题】:datetime period with optional months带有可选月份的日期时间段
【发布时间】:2015-06-01 02:19:51
【问题描述】:

我正在尝试在 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 tose 字段是可选的吗?

【问题讨论】:

  • 为什么您的输入中有混合符号?我只是好奇。严格意义上来说,这不是一个单一的持续时间(周期),而是一系列持续时间。例如: 1month - 30days 是未来还是过去?很奇怪。 - 关于您的问题本身:Joda-Time 在解析周期中没有可选部分的概念(只有几秒钟,可选毫秒,而不是更多)。也许专门的PeriodParser 会有所帮助,但我建议先应用标记器(更简单)。
  • PeriodParser 实现是否帮助您解决了问题?

标签: java parsing datetime format jodatime


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2012-01-30
    • 2013-06-07
    相关资源
    最近更新 更多