Java 使用LocalDate#plusMonths方法计算两个日期之间的月计数的方法?

Java 使用LocalDate#plusMonths方法计算两个日期之间的月计数的方法?,java,date,java-8,jodatime,localdate,Java,Date,Java 8,Jodatime,Localdate,我需要根据我的任务处理日期。准确地说,我需要检查两个日期之间的月差是否为整数。2日期-输入参数。结果-布尔值:true如果月份计数准确(无尾)false否则。 例如: 2018年1月31日和2018年2月28日之间的差值应为1个月,并且可以组合使用。 2018年1月30日和2018年2月28日:一个月无尾,所以正常 2018年1月29日和2018年2月28日:一个月无尾,所以正常 2018年1月28日和2018年2月28日:一个月无尾,所以正常 2018年1月27日和2018年2月28日:0个月

我需要根据我的任务处理日期。准确地说,我需要检查两个日期之间的月差是否为整数。2日期-输入参数。结果-布尔值:
true
如果月份计数准确(无尾)
false
否则。
例如:

2018年1月31日和2018年2月28日之间的差值应为1个月,并且可以组合使用。
2018年1月30日
2018年2月28日
一个月无尾,所以正常
2018年1月29日
2018年2月28日
一个月无尾,所以正常
2018年1月28日
2018年2月28日
一个月无尾,所以正常
2018年1月27日
2018年2月28日
0个月

让我们看另一个参数:
2018年2月28日
2018年3月28日
一个月无尾,所以ok
2018年2月28日
2018年3月29日
1个月+1天,因此失败
2018年2月28日
2018年3月27日
0个月带尾,因此失败

我发现java date api有专门用于日期计算的api,但在我看来,它的工作原理是矛盾的:

LocalDate.of(2018, 1, 31).until(LocalDate.of(2018, 2, 28), ChronoUnit.MONTHS); //  0     
LocalDate.of(2018, 1, 31).plusMonths(1); // but 2018-02-28
第二个结果是预期的,但第一个结果不是。看起来很奇怪


您能否建议两个日期之间的月数计算方法,该方法与
LocalDate#plusMonths
方法一致?

Joda time按预期工作:

Months.monthsBetween(org.joda.time.LocalDate.parse("2018-1-31"),org.joda.time.LocalDate.parse("2018-2-28")).getMonths() //1

用日历术语表示日期之间的差异是不明确的。1月31日至2月28日之间的
期间可以是“1个月0天”或“0个月28天”。两个答案都完全正确

如果您想实现确定两个日期是否与
plusMonths
对齐的特定逻辑,java.time提供了所有工具。首先,获取日期之间的月数,不考虑月中的天数,然后使用
plusMonths
测试:

boolean isExactMonths(LocalDate a, LocalDate b) {
    long months = ChronoUnit.MONTHS.between(YearMonth.from(a), YearMonth.from(b));
    return a.plusMonths(months).equals(b);
}

你能用简单的英语说明你对月差的定义吗?你的例子不清楚。顺便说一下,为了便于阅读,在这里展示示例日期时,请使用标准ISO 8601格式(YYYY-MM-DD)。一个月的“尾巴”是什么?并在发布前搜索堆栈溢出。这个问题很可能是重复的。我投票以“不清楚”结束。@Basil Bourque,这是joda时间格式。它不是重复的。月份。介于(“2018年1月31日”、“2018年2月28日”)之间返回0,但我预计1@gstackoverflow正确,但是答案中的代码,
ChronoUnit.MONTHS.between(YearMonth.from(a),YearMonth.from(b))
使用
YearMonth
,因此按照您所说的返回1。我用您问题中的七个示例测试了这段代码。输出与我的答案一致,我相信我的答案与您的意图一致。加上这段代码比我的要优雅得多。我删除了我的评论。我没有注意到这个问题是专门针对Joda Time和java.Time的。