org.joda.time.datetime.plusMonths 添加月数,缺少天数。

我尝试使用 java DateTime和方法 plusMonths()从给定的开始日期添加完整的月份. 

当我的开始时间是在一个月的开始时,一切都像预期的那样工作:

DateTime startOfMonth = new DateTime(2013, 1, 1, 00, 00, 00);
    System.out.println(startOfMonth.toString());
    for (int i = 0; i < 12; i++) {
        startOfMonth = startOfMonth.plusMonths(1);
        System.out.println(startOfMonth.toString());
}

  

输出是每个月的第一天,就像预期的一样,一切都很棒!

2013-01-01T00:00:00.000+01:00
2013-02-01T00:00:00.000+01:00
2013-03-01T00:00:00.000+01:00
2013-04-01T00:00:00.000+02:00
2013-05-01T00:00:00.000+02:00
2013-06-01T00:00:00.000+02:00
2013-07-01T00:00:00.000+02:00
2013-08-01T00:00:00.000+02:00
2013-09-01T00:00:00.000+02:00
2013-10-01T00:00:00.000+02:00
2013-11-01T00:00:00.000+01:00
2013-12-01T00:00:00.000+01:00
2014-01-01T00:00:00.000+01:00

  

但是,当我将我的例子改为月末时,它不会返回我想要的东西!

System.out.println("");
DateTime endOfMonth = new DateTime(2012, 12, 31, 23, 59, 59);
System.out.println(endOfMonth.toString());
for (int i = 0; i < 12; i++) {
    endOfMonth = endOfMonth.plusMonths(1);
    System.out.println(endOfMonth.toString());
}

  

返回:问题来了

2012-12-31T23:59:59.000+01:00
2013-01-31T23:59:59.000+01:00
2013-02-28T23:59:59.000+01:00
2013-03-28T23:59:59.000+01:00
2013-04-28T23:59:59.000+02:00
2013-05-28T23:59:59.000+02:00
2013-06-28T23:59:59.000+02:00
2013-07-28T23:59:59.000+02:00
2013-08-28T23:59:59.000+02:00
2013-09-28T23:59:59.000+02:00
2013-10-28T23:59:59.000+01:00
2013-11-28T23:59:59.000+01:00
2013-12-28T23:59:59.000+01:00

  

日期操作的问题是月份具有不同的天数.在1月份,你有31天,2月只有28天.如果你将“一个月”添加到1月31日,软件无法猜出你想要达到的目标,所以它会增加月份的增量,这将给你2月31日 – 无效.然后,下一步是调和产生这些奇怪结果的日期.

注意:在原始的Java Date类中,在1月份添加一个月之后你会得到3月2日或3日,这不是更好:-)

迭代月末的正确方法是迭代当月的第一天并减去一天(或一毫秒):

DateTime startOfMonth = new DateTime(2013, 1, 1, 00, 00, 00);
System.out.println(startOfMonth.toString());
for (int i = 0; i < 12; i++) {
    startOfMonth = startOfMonth.plusMonths(1);
    DateTime endOfMonth = startOfMonth.minusDays(1); // magic here
    System.out.println(startOfMonth + "-" + endOfMonth);
}

  

或者,定义一常量:

1月=31天,2=28天,3月=31天.......
假如当前月份是2月需要+1个月,获取3月份的天数31天,2月份+31天数;

原文地址:https://www.cnblogs.com/achengmu/p/13030065.html