You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 17中如何对Period进行美观易读的格式化?

关于Period格式化为易读年龄字符串的方案

现有工具选择

Java生态内可以直接用Apache Commons Lang3提供的PeriodFormat工具类实现需求,不需要从零开发。它原生支持跳过0值单位、自动处理单复数,也支持自定义配置,实现数值为1时替换为单词one的效果,直接就能输出你给出的示例格式。

自定义实现的规范方案

如果需要自行开发实现,按以下逻辑处理足够规范:

  • 第一步:过滤Period的年、月、日三个单位,仅保留数值大于0的项
  • 第二步:对每个保留的项做文本转换:数值为1时输出one + 单数单位(one year/one month/one day),数值大于1时输出数字 + 复数单位
  • 第三步:拼接转换后的文本项:仅1项直接输出;2项用and连接;3项及以上时,前N-1项用, 分隔,最后一项前加and

以下是核心实现代码示例:

public static String formatHumanReadablePeriod(Period period) {
    List<String> validParts = new ArrayList<>();

    int years = period.getYears();
    if (years > 0) {
        validParts.add(years == 1 ? "one year" : years + " years");
    }

    int months = period.getMonths();
    if (months > 0) {
        validParts.add(months == 1 ? "one month" : months + " months");
    }

    int days = period.getDays();
    if (days > 0) {
        validParts.add(days == 1 ? "one day" : days + " days");
    }

    if (validParts.isEmpty()) {
        return "0 days";
    }
    if (validParts.size() == 1) {
        return validParts.get(0);
    }
    if (validParts.size() == 2) {
        return String.join(" and ", validParts);
    }
    return String.join(", ", validParts.subList(0, validParts.size() - 1)) 
            + " and " + validParts.get(validParts.size() - 1);
}

关于是否必须使用Format抽象类

没有强制要求必须继承Format抽象类。如果你的项目全量格式化逻辑都基于Format体系做统一抽象,那可以继承该类实现formatToBuffer和parseObject方法保持代码风格一致;如果只是单次业务场景使用,直接写静态工具方法即可,不需要做多余的抽象设计。

内容的提问来源于stack exchange,提问作者Jegors Čemisovs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:09:01