package com.demo.common.pojo.util;
import com.alibaba.fastjson.JSON;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
public class CalendarUtils {
/**
* 获取所有的时间范围内的时间,返回格式是yyyy-MM-dd
* @param startTime
* @param endTime
* @return
*/
public static Set<String> getAllTimeBetween(LocalDateTime beginTime, LocalDateTime endTime){
Date beginDate = DateTimeUtils.localDateToDate(beginTime.toLocalDate());
Date endDate = DateTimeUtils.localDateToDate(endTime.toLocalDate());
Set<String> dateTimes = new LinkedHashSet<>();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(beginDate);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(endDate);
tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
while (tempStart.before(tempEnd)) {
dateTimes.add(simpleDateFormat.format(tempStart.getTime()));
tempStart.add(Calendar.DAY_OF_YEAR, 1);
}
return dateTimes;
}
/**
* 获取所有的时间范围内的时间,返回格式是yyyy-MM-dd
* @param startTime
* @param endTime
* @return
*/
public static Set<String> getAllTimeBetween(Date startTime, Date endTime){
Set<String> dateTimes = new LinkedHashSet<>();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(startTime);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(endTime);
tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
while (tempStart.before(tempEnd)) {
dateTimes.add(simpleDateFormat.format(tempStart.getTime()));
tempStart.add(Calendar.DAY_OF_YEAR, 1);
}
return dateTimes;
}
/**
* 获取前X天的日期时间
* @param time
* @param day
* @return
*/
public static Date getBeforeDayTime(Date time, Integer day){
Calendar calendar = Calendar.getInstance();
calendar.setTime(time);
calendar.add(Calendar.DATE, -day);
return calendar.getTime();
}
/**
* 根据时间获取当前周数
* @return
*/
public static Integer getWeekTimeByTime(Date time){
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
calendar.setTimeInMillis(time.getTime());//获得当前的时间戳
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);//获得当前日期属于今年的第几周
return weekOfYear;
}
/**
* 获取年份+周数获取周一的时间
* @param year
* @param weekTimes
* @return
*/
public static Date getWeekTimesStartTime(Integer year, Integer weekTimes){
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
calendar.setWeekDate(year, weekTimes, 2);//获得指定年的第几周的开始日期
return calendar.getTime();
}
/**
* 获取年份+周数获取周日的时间
* @param year
* @param weekTimes
* @return
*/
public static Date getWeekTimesEndTime(Integer year, Integer weekTimes){
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
calendar.setWeekDate(year, weekTimes, 1);//获得指定年的第几周的开始日期
return calendar.getTime();
}
/**
* 获取年份+周数获取周一的时间
* @param year
* @param weekTimes
* @return
*/
public static LocalDateTime getWeekTimesStartLocalDateTime(Integer year, Integer weekTimes){
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
calendar.setWeekDate(year, weekTimes, 2);//获得指定年的第几周的开始日期
return DateTimeUtils.parseMinTime(DateTimeUtils.parseLocalDate(calendar.getTime()));
}
/**
* 获取年份+周数获取周日的时间
* @param year
* @param weekTimes
* @return
*/
public static LocalDateTime getWeekTimesEndLocalDateTime(Integer year, Integer weekTimes){
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
calendar.setWeekDate(year, weekTimes, 1);//获得指定年的第几周的开始日期
return DateTimeUtils.parseMaxTime(DateTimeUtils.parseLocalDate(calendar.getTime()));
}
public static int getMaxWeekNumOfYear(int year) {
Calendar c = new GregorianCalendar();
c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);
return getWeekOfYear(c.getTime());
}
public static int getWeekOfYear(Date date) {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setMinimalDaysInFirstWeek(7);
c.setTime(date);
return c.get(Calendar.WEEK_OF_YEAR);
}
public static List<String> getTimeBetweenWeekTimes(Date startTime, Date endTime){
List<String> yearOfWeekTimes = new ArrayList<>();
Integer startYear = Integer.valueOf(startTime.getYear());
Integer endYear = Integer.valueOf(endTime.getYear());
if(endYear>startYear){
//相差多少年
int startNowWeekTimes = getWeekTimeByTime(startTime);
int startMaxWeekTimes = getMaxWeekNumOfYear(startYear);
for(int i = startNowWeekTimes;i<=startMaxWeekTimes;i++){
yearOfWeekTimes.add(startYear+"-"+i);
}
Integer betweenYear = endYear - startYear;
for(int i = betweenYear;i>1;i--){
int nowYear = startYear+betweenYear;
int weekSize = getMaxWeekNumOfYear(nowYear);
for(int weekTime = 1;weekTime<=weekSize;weekTime++){
yearOfWeekTimes.add(nowYear+"-"+weekTime);
}
}
int endMaxWeekTimes = getWeekTimeByTime(endTime);
for(int i = 1;i<=endMaxWeekTimes;i++){
yearOfWeekTimes.add(endYear+"-"+i);
}
}else{
int startNowWeekTimes = getWeekTimeByTime(startTime);
int endMaxWeekTimes = getWeekTimeByTime(endTime);
for(int i = startNowWeekTimes;i<=endMaxWeekTimes;i++){
yearOfWeekTimes.add(startYear+"-"+i);
}
}
return yearOfWeekTimes;
}
}