【问题标题】:Display relative time with one number with Joda time [Java]Joda time [Java] 用一个数字显示相对时间
【发布时间】:2015-03-14 21:17:50
【问题描述】:

所以我使用Joda time 并希望它只显示一个数字(我知道如何在 Joda 中处理复数,最后只是一个简单的示例)。

示例:
2 years 2 months 2 weeks ago 应该只显示 2 years ago
2 days 2 hours 2 minutes ago 应该只显示 2 days ago

我正在寻找一些方法来在它获得非零数字时短路附加。我已经搜索并找到了其他框架的示例,但我们已经在使用 Joda time,如果可能的话,我不想引入其他依赖项。

我现在的代码如下:

protected final String toRelativeTime(final DateTime dateTime) {
    DateTime now = new DateTime();
    Period period = new Period(dateTime, now);

    PeriodFormatter formatter = new PeriodFormatterBuilder()
            .appendYears().appendSuffix(" years")
            .appendMonths().appendSuffix(" months")
            .appendWeeks().appendSuffix(" weeks")
            .appendDays().appendSuffix(" days")
            .appendHours().appendSuffix(" hours")
            .appendMinutes().appendSuffix(" minutes")
            .appendSeconds().appendSuffix(" seconds")
            .printZeroNever()
            .toFormatter();
    return formatter.print(period);
}

【问题讨论】:

  • 您还搜索了哪些其他框架?我只是好奇。正如您在建议的答案中看到的那样,Joda-Time 在这个领域处理起来非常尴尬。

标签: java jodatime duration period


【解决方案1】:

以下功能将完全满足您的要求。

protected final String toRelativeTime(final DateTime dateTime) {
    long nowLngTime = System.currentTimeMillis();
    DateTime now = new DateTime();
    long difference = Math.abs(dateTime.getTime() - nowLngTime);
    Period period = new Period(dateTime, now);
    PeriodFormatterBuilder formatterBuilder = new PeriodFormatterBuilder();
    if (difference > DateUtils.YEAR_IN_MILLIS) {
        formatterBuilder.appendYears().appendSuffix(" year");
    } else if (difference > DateUtils.DAY_IN_MILLIS * 30) {
        formatterBuilder.appendMonths().appendSuffix(" month");
    } else if (difference > DateUtils.WEEK_IN_MILLIS) {
        formatterBuilder.appendWeeks().appendSuffix(" week");
    } else if (difference > DateUtils.DAY_IN_MILLIS) {
        formatterBuilder.appendDays().appendSuffix(" day");
    } else if (difference > DateUtils.HOUR_IN_MILLIS) {
        formatterBuilder.appendHours().appendSuffix(" hour");
    } else if (difference > DateUtils.MINUTE_IN_MILLIS) {
        formatterBuilder.appendMinutes().appendSuffix(" minute");
    } else if (difference > DateUtils.SECOND_IN_MILLIS) {
        formatterBuilder.appendSeconds().appendSuffix(" second");
    }
    String ends = formatterBuilder.printZeroNever().toFormatter().print(period);
    String plural = ends.startsWith("1 ")?"":"s";
    return plural;
}

【讨论】:

    【解决方案2】:

    我最终这样做了

    private final String toRelativeTime(LocalDateTime startTime, LocalDateTime endTime) {
        final String sufix = " ago";
        final Long seconds = ChronoUnit.SECONDS.between(startTime, endTime);
        final Long minutes = ChronoUnit.MINUTES.between(startTime, endTime);
        final Long hours = ChronoUnit.HOURS.between(startTime, endTime);
        final Long days = ChronoUnit.DAYS.between(startTime, endTime);
        final Long weeks = ChronoUnit.WEEKS.between(startTime, endTime);
        final Long months = ChronoUnit.MONTHS.between(startTime, endTime);
        final Long years = ChronoUnit.YEARS.between(startTime, endTime);
    
        if(years > 0) {
            return years.toString() + " " + checkPluralisation(years, "year", "years") + sufix;
        } else if(months > 0) {
            return months.toString() + " " + checkPluralisation(months, "month", "months") + sufix;
        }else if(weeks > 0) {
            return weeks.toString() + " " + checkPluralisation(weeks, "week", "weeks") + sufix;
        }else if(days > 0) {
            return days.toString() + " " + checkPluralisation(days, "day", "days") + sufix;
        }else if(hours > 0) {
            return hours.toString() + " " + checkPluralisation(hours, "hour", "hours") + sufix;
        }else if(minutes > 0) {
            return minutes.toString() + " " + checkPluralisation(minutes, "minute", "minutes") + sufix;
        } else {
            return seconds.toString() + " " + checkPluralisation(seconds, "second", "seconds") + sufix;
        }
    }
    

    【讨论】:

    • 啊,Java 8。还有很多类似于 Joda-Time 的工作,而不是单线 ;-)
    • 无论如何,您的回答表明 Joda-Time 没有提供足够的功能来阻止(官方推荐)迁移到 Java-8 中的 java.time。至少您(仍然很长)的解决方法与 Joda-Time 的工作量大致相同,并且可以向愿意迁移的人展示如何替换丢失的 PeriodFormatter,因此我赞成。
    • @MenoHochschild 同意,这感觉有点长。在 Joda-Time 中我并没有真正把它变小,所以我只使用了 Java 8。
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2014-03-24
    • 2020-07-08
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多