代码拉取完成,页面将自动刷新
package com.quietor.calendar.week;
import com.quietor.calendar.constants.CalendarMonth;
import com.quietor.calendar.constants.YearDays;
import com.quietor.calendar.tool.CalendarTool;
import com.quietor.calendar.exception.CalendarException;
/**
* @author Quietor
* @create 2018-06-17 17:47
* @desc 根据已知星期的日期计算指定日志的星期
* 该方法需要具体的分析每个年份是否是闰年,在此基础上计算两个日期之间的天数差值
**/
public class CaclulateWeekdayWithGregorian {
public static int calculateDays(int startYear, CalendarMonth startMonth, int startDay, int endYear, CalendarMonth endMonth, int endDay) throws CalendarException {
CalendarTool.checkParam(startYear, startMonth, startDay);
CalendarTool.checkParam(endYear, endMonth, endDay);
int startPassedDays = calculatePassedDays(startYear, startMonth, startDay);
int endPassedDays = calculatePassedDays(endYear, endMonth, endDay);
int daysOfWholeYear = calculateDaysOfYears(startYear, endYear);
int days = calculateDays(startYear, endYear);
int totalDays = daysOfWholeYear + endPassedDays - startPassedDays;
int total = days + endPassedDays - startPassedDays;
return totalDays;
}
/**
* @param startYear 起始年份
* @param endYear 截止年份
* @return 从起止年份到截止年份前一年的天数
* 常量 YearDays.LEAP_YEAR_DAYS = 366
* 常量 YearDays.NONLEAP_YEAR_DAYS = 365
* @throws CalendarException
*/
public static int calculateDays(int startYear, int endYear) throws CalendarException {
startYear -= 1;
endYear -= 1;
int startLeaps = Integer.valueOf(startYear / 4) - Integer.valueOf(startYear / 100) + Integer.valueOf(startYear / 400);
int endLeaps = Integer.valueOf(endYear / 4) - Integer.valueOf(endYear / 100) + Integer.valueOf(endYear / 400);
int totalDays = endLeaps * YearDays.LEAP_YEAR_DAYS + (endYear - endLeaps) * YearDays.NONLEAP_YEAR_DAYS -(startLeaps * YearDays.LEAP_YEAR_DAYS + (startYear - startLeaps) * YearDays.NONLEAP_YEAR_DAYS);
return totalDays;
}
/**
* @param startYear 起始年份
* @param endYear 截止年份
* @return 从起止年份到截止年份前一年的天数
* 常量 YearDays.LEAP_YEAR_DAYS = 366
* 常量 YearDays.NONLEAP_YEAR_DAYS = 365
* @throws CalendarException
*/
public static int calculateDaysOfYears(int startYear, int endYear) throws CalendarException {
if(startYear > endYear) {
throw new CalendarException(String.format("illegal parameter year, startYear=%s endYear=%s", startYear, endYear));
}
int difference = endYear - startYear;
int totalDays = 0;
//从起始年的1月1号开始加和,一直到截止年的前一年所有的天数,这样的计算需要减去起始年已经过过去的天数
for(int i= startYear; i < endYear; i++) {
boolean isLeap = CalendarTool.isLeapyear(i);
if (isLeap) {
totalDays += YearDays.LEAP_YEAR_DAYS;
} else {
totalDays += YearDays.NONLEAP_YEAR_DAYS;
}
}
return totalDays;
}
/**
* 计算一年中到指定日期时已经度过的天数
* @param year
* @param month
* @param day
* @return
*/
public static int calculatePassedDays(int year, CalendarMonth month, int day) throws CalendarException {
CalendarTool.checkParam(year, month, day);
int monthValue = month.getSort();
int passedTotal = 0;
for(int i = 1; i < monthValue; i++) {
CalendarMonth passedMonth = CalendarMonth.getMonthBySort(i);
if(passedMonth.equals(CalendarMonth.FEBRUARY)) {
boolean isLeap = CalendarTool.isLeapyear(year);
if(isLeap) {
passedTotal += 29;
continue;
}
}
passedTotal += passedMonth.getDays();
}
return passedTotal + day;
}
public static void main(String[] args) throws CalendarException {
int totalDays = calculateDays(1977, CalendarMonth.MARCH, 27, 2005, CalendarMonth.MAY, 31);
System.out.println(totalDays);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。