1.代码
@Slf4j
public class DateUtil {
public static final String FORMATE_YYYY_MM_MINUS = "yyyy-MM";
public static final String FORMATE_YYYY_MM_DD_MINUS = "yyyy-MM-dd";
public static final String FORMATE_YYYY_MM_DD_HH_MM_SS_MINUS = "yyyy-MM-dd HH:mm:ss";
public static Date convertToDate(String str, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
try {
return sdf.parse(str);
} catch (ParseException pse) {
return null;
}
}
public static String convertDateToStr(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
public static Date convertDateToDate(Date date, String format){
String dateToStr = DateUtil.convertDateToStr(date, format);
return DateUtil.convertToDate(dateToStr,format);
}
public static Date getStartTimeAsDate(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
return calendar.getTime();
}
public static Date getEndTimeAsDate(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY,23);
calendar.set(Calendar.MINUTE,59);
calendar.set(Calendar.SECOND,59);
calendar.set(Calendar.MILLISECOND,999);
return calendar.getTime();
}
public static List<String> getDays(String startTime, String endTime) {
List<String> days = new ArrayList<>();
DateFormat dateFormat = new SimpleDateFormat(FORMATE_YYYY_MM_DD_MINUS);
try {
Date start = dateFormat.parse(startTime);
Date end = dateFormat.parse(endTime);
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
tempEnd.add(Calendar.DATE, +1);
while (tempStart.before(tempEnd)) {
days.add(dateFormat.format(tempStart.getTime()));
tempStart.add(Calendar.DAY_OF_YEAR, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return days;
}
public static Integer getWeek(Date date) {
Integer[] weekDays = { 7, 1, 2, 3, 4, 5, 6 };
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
public static String getWeekToString(Date date) {
String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
public static Date getDayOfWeek(int dayOfWeek, int weekOffset){
Calendar date = Calendar.getInstance();
date.add(Calendar.WEEK_OF_MONTH,weekOffset);
date.set(Calendar.DAY_OF_WEEK, dayOfWeek);
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
return date.getTime();
}
public static List<Date> getWeekInTimes(String start, String end, int week) {
List<Date> list = new ArrayList<>();
LocalDate startLocalDate = LocalDate.parse(start, DateTimeFormatter.ofPattern(DateUtil.FORMATE_YYYY_MM_DD_MINUS));
LocalDate endLocalDate = LocalDate.parse(end, DateTimeFormatter.ofPattern(DateUtil.FORMATE_YYYY_MM_DD_MINUS));
long days = ChronoUnit.DAYS.between(startLocalDate, endLocalDate);
log.info("[开始时间:{}, 结束时间{}]之间共有: {}天", start, end, days);
Calendar startCalender = GregorianCalendar.from(startLocalDate.atStartOfDay(ZoneId.systemDefault()));
for (int i = 0; i < days; i++) {
startCalender.add(Calendar.DATE, 1);
if (startCalender.get(Calendar.DAY_OF_WEEK) == week + 1) {
LocalDate localDate = LocalDateTime.ofInstant(startCalender.toInstant(), ZoneOffset.systemDefault()).toLocalDate();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
Date date = Date.from(instant);
list.add(date);
}
}
log.info("[开始时间:{}, 结束时间:{}]之间共有: {}个 星期{}", start, end, list.size(), week);
return list;
}
public static boolean inScope(Date nowTime, Date startTime, Date endTime) {
if (nowTime == null){
throw new RuntimeException("当前时间不能为空!");
}
if (startTime == null){
throw new RuntimeException("开始时间不能为空!");
}
if (endTime == null){
throw new RuntimeException("结束时间不能为空!");
}
if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
public static Date getDayEndTime(Date date) {
Calendar dateEnd = Calendar.getInstance();
dateEnd.setTime(date);
dateEnd.set(Calendar.HOUR_OF_DAY, 23);
dateEnd.set(Calendar.MINUTE, 59);
dateEnd.set(Calendar.SECOND, 59);
return dateEnd.getTime();
}
public static Date getMonthEnd(String month,String format){
Date monthDate = DateUtil.convertToDate(month, format);
if (monthDate == null){
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(monthDate);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
return calendar.getTime();
}
}
2.测试
@Test
public void getWeekInTimesTest(){
List<Map<String,Object>> resultList = new ArrayList<>();
List<Date> weekInTimes = DateUtil.getWeekInTimes("2020-12-01", "2020-11-31", 3);
log.info("时间: " + JSON.toJSONString(weekInTimes));
for (Date date : weekInTimes) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Date startDate = calendar.getTime();
calendar.add(Calendar.DAY_OF_MONTH, -6);
Date endDate = calendar.getTime();
Map<String,Object> map = new HashMap<>();
map.put("startTime",DateUtil.convertDateToStr(startDate,DateUtil.FORMATE_YYYY_MM_DD_MINUS));
map.put("endTime",DateUtil.convertDateToStr(endDate,DateUtil.FORMATE_YYYY_MM_DD_MINUS));
resultList.add(map);
log.info("开始时间:{}, 结束时间:{}", startDate, endDate);
}
log.info("时间结果: " + JSON.toJSONString(resultList));
}