我尝试使用 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天数;