java - 带有可选月份的日期时间段

标签 java parsing datetime format jodatime

我正在尝试在 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/

相关文章:

c++ - boost spirit 2.4.2 : Cannot extract a string

python - 如何从 xml.dom.minidom Dom 元素获取文本?

javascript - 在页面加载时加载时间戳并将其与表单提交时的时间戳进行比较

java - 成功执行servlet后如何在jsp中生成成功警报?

java - Mapstruct - 忽略集合内的属性

java - (如何操作)Poker Positioning using ENUM

解析大文件

java - 将纪元时间转换为小时

excel - 如何在 Excel 中表示日期时间

java - 从mysql数据库获取坐标数组并添加为标记到android中的Google map