日期工具类
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author smile.zhao
* @version 1.0
* @date 2024/7/25 12:00
*/
@Slf4j
public class ProductDateUtil {
/**
* 判断日期是否合法
*
* @param dateStr
* @return
*/
public static boolean isLegalDate(String dateStr) {
String format = "yyyy-MM-dd";
if (ObjectUtil.isEmpty(dateStr)) {
return false;
}
try {
DateUtil.parse(dateStr, format);
return true;
} catch (Exception e) {
log.error("日期格式错误:", e);
return false;
}
}
/**
* 获取前一天日期
*
* @param: dateTime 入参是当前时间2020-03-01
* @return: 返参是前一天的日期, 理应为2020-02-29(闰年)
*/
public static String getBeforeLastDay(String dateTime) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = simpleDateFormat.parse(dateTime);
} catch (ParseException e) {
log.error("String转Date日期失败:", e);
throw new RuntimeException("String转Date日期失败");
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
//往前一天
calendar.add(Calendar.DAY_OF_MONTH, -1);
return simpleDateFormat.format(calendar.getTime());
}
/**
* 获取前一个月的第一天
*
* @param dateTime
* @return
*/
public static String getBeforeLastMonthStart(String dateTime) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
try {
c.setTime(simpleDateFormat.parse(dateTime));
} catch (ParseException e) {
log.error("String转Date日期失败:", e);
throw new RuntimeException("String转Date日期失败");
}
c.add(Calendar.MONTH, -1);
return simpleDateFormat.format(c.getTime());
}
/**
* 获取前一个月的最后一天
*
* @param dateTime
* @return
*/
public static String getBeforeLastMonthEnd(String dateTime) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
try {
c.setTime(simpleDateFormat.parse(dateTime));
} catch (ParseException e) {
log.error("String转Date日期失败:", e);
throw new RuntimeException("String转Date日期失败");
}
c.add(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH, 0);
return simpleDateFormat.format(c.getTime());
}
/**
* 获取指定时间的对应的周一的日期
*
* @param dateTime
* @return
*/
public static String getDateOfWeekStart(String dateTime) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date d = null;
try {
d = simpleDateFormat.parse(dateTime);
} catch (ParseException e) {
log.error("String转Date日期失败:", e);
}
Calendar ca = Calendar.getInstance();
ca.setTime(d);
int year = ca.get(Calendar.YEAR);
int mon = ca.get(Calendar.MONTH) + 1;
int day = ca.get(Calendar.DAY_OF_MONTH);
LocalDate date = LocalDate.of(year, mon, day);
while (date.getDayOfWeek() != DayOfWeek.MONDAY) {
date = date.minusDays(1);
}
log.info("本周周一的日期:" + date);
return date.toString();
}
/**
* 获取今天日期
*
* @return
*/
public static String getTodayDate() {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取指定时间的周日的日期
*
* @param dateTime
* @return
*/
public static String getDateOfWeekEnd(String dateTime) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date d = null;
try {
d = simpleDateFormat.parse(dateTime);
} catch (ParseException e) {
log.error("String转Date日期失败:", e);
}
Calendar ca = Calendar.getInstance();
ca.setTime(d);
int year = ca.get(Calendar.YEAR);
int mon = ca.get(Calendar.MONTH) + 1;
int day = ca.get(Calendar.DAY_OF_MONTH);
LocalDate date = LocalDate.of(year, mon, day);
while (date.getDayOfWeek() != DayOfWeek.SUNDAY) {
date = date.plusDays(1);
}
log.info("本周周日的日期:" + date);
return date.toString();
}
/**
* 获取7天前的日期
*
* @return
*/
public static String getTheDayBeforeSevenDay() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -7);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取14天前的日期
*
* @return
*/
public static String getTheDayBeforeFourteenDay() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -14);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取8天前的日期
*
* @return
*/
public static String getTheDayBeforeEightDay() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -8);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取30天前的日期
*
* @return
*/
public static String getTheDayBeforeThirtyDay() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -30);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取31天前的日期
*
* @return
*/
public static String getTheDayBeforeThirtyOneDay() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -31);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取60天前的日期
*
* @return
*/
public static String getTheDayBeforeSixtyDay() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -60);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取两个日期之间的天数
*
* @param startDay
* @param endDay
* @return
*/
public static int getCycleDate(String startDay, String endDay) {
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
int i = 0;
try {
//开始时间
Date star = dft.parse(startDay);
//结束时间
Date end = dft.parse(endDay);
Date nextDay = star;
//当明天不在结束时间之前是终止循环
if (end.before(nextDay)) {
return -1;
}
while (nextDay.before(end)) {
Calendar cld = Calendar.getInstance();
cld.setTime(star);
cld.add(Calendar.DATE, 1);
star = cld.getTime();
//获得下一天日期字符串
nextDay = star;
i++;
}
System.out.println("相差天数为:" + i);
} catch (ParseException e) {
log.error("日期转换失败:", e);
throw new RuntimeException("日期转换失败");
}
return i;
}
/**
* 自定义日期上一个周期开始时间
*
* @param startDay
* @param endDay
* @return
*/
public static String getCustomStartDay(String startDay, String endDay) {
int cycleDate = getCycleDate(startDay, endDay);
if (cycleDate < 0) {
log.error("日期差范围不合法");
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(startDay);
} catch (ParseException e) {
log.info("日期转换失败:", e);
throw new RuntimeException("日期转换失败");
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -(cycleDate + 1));
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 自定义日期上一个周期结束时间
*
* @param startDay
* @param endDay
* @return
*/
public static String getCustomEndDay(String startDay, String endDay) {
int cycleDate = getCycleDate(startDay, endDay);
if (cycleDate < 0) {
log.error("日期差范围不合法");
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(endDay);
} catch (ParseException e) {
log.info("日期转换失败:", e);
throw new RuntimeException("日期转换失败");
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
// 在当前日基础上-1
calendar.add(Calendar.DAY_OF_MONTH, -(cycleDate + 1));
String format = sdf.format(calendar.getTime());
return format;
}
/**
* 获取两个日期之间的日期集合
*
* @param startDay
* @param endDay
* @return
*/
public static List<String> getDatesBetweenTwoDates(String startDay, String endDay) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> datesInRange = new ArrayList<>();
Calendar calendar = new GregorianCalendar();
try {
calendar.setTime(sdf.parse(startDay));
} catch (ParseException e) {
log.error("日期转换失败:", e);
}
Calendar endCalendar = new GregorianCalendar();
try {
endCalendar.setTime(sdf.parse(endDay));
} catch (ParseException e) {
log.error("日期转换失败:", e);
throw new RuntimeException(e);
}
while (calendar.before(endCalendar)) {
Date result = calendar.getTime();
datesInRange.add(sdf.format(result));
calendar.add(Calendar.DATE, 1);
}
return datesInRange;
}
/**
* 获取上12个月的日期
*
* @param month
* @return
*/
public static List<String> getPrevious12Months(String month) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(month));
} catch (ParseException e) {
log.error("日期转换失败:", e);
throw new RuntimeException(e);
}
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date firstDayOfMonth = calendar.getTime();
month = sdf.format(firstDayOfMonth);
List<String> previousMonths = new ArrayList<>();
LocalDate currentDate = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
for (int i = 0; i < 12; i++) {
currentDate = currentDate.minusMonths(1);
String formattedDate = currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
previousMonths.add(formattedDate);
}
if (previousMonths.size() == 12) {
previousMonths.add(month);
}
return previousMonths.stream().sorted().collect(Collectors.toList());
}
/**
* 获取上12周的日期
* @param startDay
* @return
*/
public static List<String> getPrevious12Weeks(String startDay) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
List<String> previousWeeks = new ArrayList<>();
try {
calendar.setTime(sdf.parse(startDay));
} catch (ParseException e) {
log.error("日期转换失败:", e);
throw new RuntimeException("日期转换失败");
}
for (int i = 0; i < 12; i++) {
// 获取本周的周一
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
String start = sdf.format(calendar.getTime());
previousWeeks.add(start);
//LocalDate currentDate = LocalDate.parse(start, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//LocalDate sunday = currentDate.with(DayOfWeek.SUNDAY);
//String end = df.format(sunday);
//System.out.println("本周的周一:" + start + ",本周的周日:" + end);
// // 获取本周的周日
// calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
// String end = sdf.format(calendar.getTime());
// System.out.println("本周的周一:" + start + ",本周的周日:" + end);
calendar.add(Calendar.WEEK_OF_YEAR, -1);
}
return previousWeeks.stream().sorted().collect(Collectors.toList());
}
public static void main(String[] args) {
List<String> previous12Weeks = getPrevious12Weeks("2024-07-16");
previous12Weeks.forEach(System.out::println);
}
}