0

我有一个Duration,喜欢P3M(3 个月)。我怎样才能得到从现在开始的天数?

我现在只有这个:

Duration.parseWeekBasedPeriod("P3M")

我知道 period 参数永远不会短于 1 周,所以parseWeekBasedPeriod()应该没问题。但我正在阅读 JavaDoc,但我不知道如何度过那些日子。

我了解,问题是月份可以有 31、30、29 和 28 天。

4

2 回答 2

1

parseWeekBasedPeriod(...)如果您想应用以月为单位的持续时间,那么使用肯定是错误的。这种非常特殊的方法处理可以持续 364 或 371 天(52 或 53 周)的基于周的年份。所以我建议只对基于日历的持续时间使用标准解析方法。下面的代码还极大地简化了两个日期之间天数的计算(见最后一行)。

Duration<CalendarUnit> duration = Duration.parseCalendarPeriod("P3M");
PlainDate today = PlainDate.nowInSystemTime();
PlainDate later = today.plus(duration);
long days = CalendarUnit.DAYS.between(today, later);

顺便说一句,我再次测试了基于周的持续时间的方法。如果它试图解析月份,它通常会抛出异常。您似乎没有看到任何异常,因此我假设您使用诸如“val”之类的无类型构造这一事实掩盖了处理持续时间字符串的必要类型信息(并且 Time4J 是一个强类型库)。因此 - 如果您在技术上可行 - 我强烈建议使用我的解决方案中显示的类型安全代码。

于 2020-04-01T20:35:18.320 回答
0

最后想通了:

val period = Duration.parseWeekBasedPeriod("P3M")
val start = PlainDate.nowInSystemTime()
val end = start.plus(period)
val days: Long = Duration.`in`(CalendarUnit.DAYS).between(start, end).getPartialAmount(CalendarUnit.DAYS)
于 2020-04-01T07:52:49.277 回答