1 Star 0 Fork 0

quietor / calendar-scheduler

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
CaclulateWeekdayWithGregorian.java 4.26 KB
一键复制 编辑 原始数据 按行查看 历史
quietor 提交于 2018-06-27 07:24 . 调整星期计算代码
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);
}
}
1
https://gitee.com/quietor/calendar-scheduler.git
git@gitee.com:quietor/calendar-scheduler.git
quietor
calendar-scheduler
calendar-scheduler
master

搜索帮助