整月(月末)增加固定的几个月后所得到的日期

针对月末日期进行加月操作时,使用Calendar接口可能导致天数减少。本文提供了一种解决方案,确保即使在月末加月后,日期也能保持在月末,以满足客户服务需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次发原创帖子(不喜勿喷,只求共同学习

首先给月初到月末之间(包括月初)的时间日期增加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;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值