第一次发原创帖子(不喜勿喷,只求共同学习)
首先给月初到月末之间(包括月初)的时间日期增加n个月后所得到的日期可以用Calendar 接口的 calendar.add(calendar.MONTH, 1);方法实现,
比如说2014-1-20 00:00:00 加1个月后日期应该为:2014-2-20 00:00:00再加1个月后的日期应该为2014-3-20 00:00:00 像这种非月末日期用Calendar 中的方法是没有问题的
但是,如果月末日期比如2014-1-31 00:00:00
用Calendar 中的方法得到的结果: 加1个月后的日期为: 2014-2-28 00:00:00 (结果正确) 再加一个月得到的日期为:2014-3-28 00:00:00 (不是我想要的结果);
我想要的结果应该是:加1个月后的日期为: 2014-2-28 00:00:00 ;再加一个月后的日期为:2014-3-31(这才是我想要的结果,一切 为客户着想,宁可让客户多享用几天服务,也不能少用几天服务)
为了解决以上问题,借用同时编写的一段代码(已征得对方同意);如果以后碰到此类问题直接使用,欢迎各位博友留言讨论,如有不正确的地方或者需要改进的地方可以一起讨论讨论。(不喜勿喷,只求共同学习)
已知存在的问题:当日期为2014-1-31、2014-1-30、2014-1-29、2014-1-28时加一个月时结果都为2014-2-28 ;再加一个月日期为2014-3-31;如果直接加2个月得到的结果为:2014-3-31、2014-3-30、2014-3-29、2014-3-28 (但这不影响我的需求,所以这个问题忽略)
public Calendar addMonth(Calendar calendar, int amount) {
int year = calendar.get(Calendar.YEAR);// 获取年份
int month = calendar.get(Calendar.MONTH) + 1;// 获取月份
int day = calendar.get(Calendar.DATE);// 获取日
calendar.add(Calendar.MONTH, amount);
// 判断时间是否需要布满当前月份
int month2 = calendar.get(Calendar.MONTH) + 1;
// 当前时间为4,6,9,11月30日
if ((month == 4 || month == 6 || month == 9 || month == 11)
&& (day == 30)) {
// 目标时间是1,3,5,7,8,10,12月
if (month2 == 1 || month2 == 3 || month2 == 5 || month2 == 7
|| month2 == 8 || month2 == 10 || month2 == 12)
calendar.add(Calendar.DATE, 1);
// 当前时间为2月28日
} else if (month == 2 && day == 28) {
// 如果是闰年则不需要处理,如果不是则补时间
if (!(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) {
// 目标时间是1,3,5,7,8,10,12月
if (month2 == 1 || month2 == 3 || month2 == 5 || month2 == 7
|| month2 == 8 || month2 == 10 || month2 == 12)
calendar.add(Calendar.DATE, 3);
// 目标时间是4,6,9,11月
if (month2 == 4 || month2 == 6 || month2 == 9 || month2 == 11)
calendar.add(Calendar.DATE, 2);
}
// 当前时间为2月29日
} else if (month == 2 && day == 29) {
// 目标时间是1,3,5,7,8,10,12月
if (month2 == 1 || month2 == 3 || month2 == 5 || month2 == 7
|| month2 == 8 || month2 == 10 || month2 == 12)
calendar.add(Calendar.DATE, 2);
// 目标时间是4,6,9,11月
if (month2 == 4 || month2 == 6 || month2 == 9 || month2 == 11)
calendar.add(Calendar.DATE, 1);
}
return calendar;
}