计算两个日期之间存在几个2月29日

本文介绍了一个实用的算法,用于判断特定年份是否为闰年,并计算两个日期间包含了多少个2月29日。通过精确的日期处理和闰年判断逻辑,该算法适用于多种场景,如时间序列数据分析、历史事件计数等。

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

    /**
	 * 判断是否闰年
	 * @param year 年份
	 * @return true表示闰年
	 */
	public static boolean bissextile(int year){
		if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
			return true;
		}else{
			return false;
		}
	}

    /**
	 * 计算startDate 与endDate之间是否存在多少个2月29日
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static int countDayOf29(Date startDate, Date endDate){
		int countDays = 0;
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(startDate);
		int startYear = calendar.getWeekYear();
		calendar.setTime(endDate);
		int endYear = calendar.getWeekYear();

		// 超过一年
		if (endYear - startYear > 1){
			for (int i = startYear+1; i<endYear; i++){
				if (bissextile(i)){
					countDays++;
				}
			}
			//判断开始年份是否存在2月29
			if (bissextile(startYear)){
				calendar.set(Calendar.YEAR, startYear);
				calendar.set(Calendar.MONTH, 1);
				calendar.set(Calendar.DATE, 29);
				Date day29 = calendar.getTime();
				if (startDate.before(day29)){
					countDays++;
				}
			}
			//判断结束年份是否包括2月29日
			if (bissextile(endYear)){
				calendar.set(Calendar.YEAR, endYear);
				calendar.set(Calendar.MONTH, 1);
				calendar.set(Calendar.DATE, 29);
				Date day29 = calendar.getTime();
				if (endDate.after(day29)){
					countDays++;
				}
			}
		}
		//开始日期闰年, 开始日期小于等于2月29日 并且结束日期大于2月29日
		else if (bissextile(startYear)){
			calendar.set(Calendar.YEAR, startYear);
			calendar.set(Calendar.MONTH, 1);
			calendar.set(Calendar.DATE, 29);
			Date day29 = calendar.getTime();
			if (startDate.before(day29) && endDate.after(day29)){
				return ++countDays;
			}
		}
		else if (bissextile(endYear)){
			calendar.set(Calendar.YEAR, endYear);
			calendar.set(Calendar.MONTH, 1);
			calendar.set(Calendar.DATE, 29);
			Date day29 = calendar.getTime();
			if (startDate.before(day29) && endDate.after(day29)){
				return ++countDays;
			}
		}
		return countDays;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值