我有一个格式化程序如下:
private static PeriodFormatter formatter = new PeriodFormatterBuilder()
.printZeroNever()
.appendYears().appendSuffix(" years ")
.appendMonths().appendSuffix(" months ")
.appendWeeks().appendSuffix(" weeks ")
.appendDays().appendSuffix(" days ")
.appendHours().appendSuffix(" hours ")
.appendMinutes().appendSuffix(" minutes ")
.appendSeconds().appendSuffix(" seconds")
.toFormatter();
并使用如下:
DateTime dt = DateTime.parse("2010-06-30T01:20");
Duration duration = new Duration(dt.toInstant().getMillis(), System.currentTimeMillis());
Period period = duration.toPeriod().normalizedStandard(PeriodType.yearMonthDayTime());
formatter.print(period);
输出是:
2274 days 13 hours 59 minutes 39 seconds
那么岁月在哪里?
答案 0 :(得分:3)
这里的根本问题是您使用Duration
开始,IMO。 Duration
只是几毫秒......考虑到这一年的年数有些麻烦,因为一年是365天或366天(甚至取决于日历系统) 。这就是toPeriod
method you're calling明确说明的原因:
仅使用句点类型中的精确字段。因此,仅使用该时段上的小时,分钟,秒和毫秒字段。不会填充年,月,周和日字段。
然后你打电话给normalizedStandard(PeriodType)
,其中包括:
天数字段及以下字段将根据需要进行标准化,但这不会溢出到月份字段中。因此,1年15个月的期限将正常化为2年3个月。但是1个月40天的时间仍然是1个月40天。
不是从Duration
创建句点,而是直接从DateTime
和"现在"创建句点,例如
DateTime dt = DateTime.parse("2010-06-30T01:20");
DateTime now = DateTime.now(); // Ideally use a clock abstraction for testability
Period period = new Period(dt, now, PeriodType.yearMonthDayTime());