我嘗試使用 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天數;