Java 当间隔大于一年时,jodatime会截断剩余的月份

Java 当间隔大于一年时,jodatime会截断剩余的月份,java,jodatime,Java,Jodatime,我尝试使用以下代码检查给定间隔是否大于12个月: public void testMonths() throws Exception { DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-mm"); DateTime from = format.parseDateTime("2010-01"); DateTime until = format.parseDateTime("2011-06");

我尝试使用以下代码检查给定间隔是否大于12个月:

public void testMonths() throws Exception {
    DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-mm");
    DateTime from = format.parseDateTime("2010-01");
    DateTime until = format.parseDateTime("2011-06");

    int months = Months.monthsBetween(from, until).getMonths();

    assertTrue(months > 12); // months = 12 for some reason.
}
当给定的间隔超过一年时,它将截断去年的剩余月份

输入我已尝试运行的:

15 months will return 12 months.
25 months will return 24 months.
36 months will return 36 months.
37 months will return 36 months.

问题在于你的文本模式。“mm”是指“分钟”而不是“月”。如果您将模式更改为
“yyyy-MM”
,您会发现它工作正常

作为指导原则,在这样的情况下,我要做的第一件事就是尽量把这个问题隔离到最小可能的问题上。因此,将文本解析和
DateTime
(时区等)的复杂性从等式中剔除:

LocalDate from = new LocalDate(2010, 1, 1);
LocalDate to = new LocalDate(2011, 6, 1);
int months = Months.monthsBetween(from, to).getMonths();
现在你会看到它是17。因此,下一步是返回原始代码,并打印出
from
to
的值。。。你会看到这样的情况:


基本上,避免文本解析,除非这是您试图诊断的问题的基本部分。

问题在于您的文本模式。“mm”是指“分钟”而不是“月”。如果您将模式更改为
“yyyy-MM”
,您会发现它工作正常

作为指导原则,在这样的情况下,我要做的第一件事就是尽量把这个问题隔离到最小可能的问题上。因此,将文本解析和
DateTime
(时区等)的复杂性从等式中剔除:

LocalDate from = new LocalDate(2010, 1, 1);
LocalDate to = new LocalDate(2011, 6, 1);
int months = Months.monthsBetween(from, to).getMonths();
现在你会看到它是17。因此,下一步是返回原始代码,并打印出
from
to
的值。。。你会看到这样的情况:


基本上,避免文本解析,除非这是您试图诊断的问题的基本部分。

谢谢您的帮助和建议,您回答了这个问题。谢谢您的帮助和建议,您回答了这个问题。