package com.ltd.cloud.meteorological.common.utils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ltd.cloud.common.core.exception.Asserts;
import com.ltd.cloud.meteorological.common.consts.DateUtilConstant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
-
@author :
-
@date :Created in 2022/8/17 17:11
-
@description:时间工具类
-
@modified By:
-
@version: $
*/
public class DateUtils extends DateUtil {public static final DateTimeFormatter DATE_FORMAT_MM_DD = DateTimeFormatter.ofPattern(“MM月dd日”);
public static final DateTimeFormatter DATE_FORMAT_MM_DD_2 = DateTimeFormatter.ofPattern(“MM-dd”);/**
- 获取指定日期前的所有年月数据(含当前时间所属月份)
- @param date 指定日期
- @return 指定日期所属月份前所有年月-含指定日期
*/
public static List getBelongYearMonthByDate(LocalDateTime date) {
return getYearMonth(date, null, date.getMonthValue());
}
/**
- 获取指定日期前一年的所有年月数据
- @param date 指定日期
- @return 指定日期前一年的所有年月数据(1 - 12月)
*/
public static List getLastYearMonthByDate(LocalDateTime date) {
return getYearMonth(date, date.getMonthValue(), 12);
}
/**
- 获取指定日期前的所有年月数据(含当前时间所属月份)以及指定日期前一年的所有年月数据
- @param date 指定日期
- @return 指定日期前的所有年月数据(含当前时间所属月份)以及指定日期前一年的所有年月数据(1 - 12月)
*/
public static List getALLYearMonthByDate(LocalDateTime date) {
return getYearMonth(date, null, date.getMonthValue() + 12);
}
/**
- 获取指定日期下的指定年月数据
- @param date 日期信息
- @param minusMonths 当前日期减去的天数
- @param limitMonth 查询X个月的数据
- @return 年月集合
*/
public static List getYearMonth(LocalDateTime date, Integer minusMonths, Integer limitMonth) {
List months = new ArrayList<>();
if (ObjectUtil.isNotEmpty(minusMonths)) {
date = date.minusMonths(date.getMonthValue());
}
Stream.iterate(date, d -> d.minusMonths(1)).limit(limitMonth).forEach(f -> {
months.add(DateUtils.format(f, DatePattern.NORM_MONTH_PATTERN));
});
return months;
}
/**
- 获取两个月份中间的所有月份
- @param startMonth 开始月份
- @param endMonth 结束月份
- @return 月份集合
*/
public static List getMiddleMonth(Integer startMonth, Integer endMonth) {
if (null == startMonth || null == endMonth) {
return null;
}
List months = new ArrayList<>();
if (startMonth < endMonth) {
for (int i = startMonth; i <= endMonth; i++) {
months.add(i);
}
} else if (startMonth.equals(endMonth)) {
months.add(startMonth);
} else {
for (int i = startMonth; i <= 12; i++) {
months.add(i);
}
for (int i = endMonth; i >= 1; i–) {
months.add(i);
}
}
return months;
}
/**
- 获取日期所属旬
- @param day 日
- @return 所属旬
*/
public static String getDayBelongXun(Integer day) {
if (null == day || day > 31 || day < 1) {
Asserts.fail(DateUtilConstant.PARAMETER_ERRORS);
}
String xun = null;
if (day >= 1 && day <= 10) {
xun = DateUtilConstant.UP_XUN;
} else if (day >= 11 && day <= 20) {
xun = DateUtilConstant.CENTRE_XUN;
} else {
xun = DateUtilConstant.DOWN_XUN;
}
return xun;
}
public static Integer getDayBelongXunReturnInteger(Integer day) {
if (null == day || day > 31 || day < 1) {
Asserts.fail(DateUtilConstant.PARAMETER_ERRORS);
}
Integer xun = null;
if (day >= 1 && day <= 10) {
xun = 1;
} else if (day >= 11 && day <= 20) {
xun = 2;
} else {
xun = 3;
}
return xun;
}/**
- 获取日期所属旬的所有时间(yyyy-MM-dd)
- @param localDate 时间
- @return 所属旬的所有日期
*/
public static List getDaysBelongXun(LocalDate localDate) {
Integer day = localDate.getDayOfMonth();
List dates = null;
String xun = null;
if (day >= 1 && day <= 10) {
dates = getDate(day, localDate);
} else if (day >= 11 && day <= 20) {
dates = getDate(day - 10, localDate);
} else {
dates = getDate(day - 20, localDate);
}
return dates;
}
/**
- 获取指定号数之前的所有日期(指定日期前的日期 格式:MM-dd)
- @param days 天数
- @param localDate 计算时间
- @return 指定号数之间的所有日期
*/
public static List getDateMonthDays(int days, LocalDate localDate) {
return getDateMonthDays(days, localDate, DATE_FORMAT_MM_DD_2);
}
/**
- 获取指定号数之前的所有日期(指定日期前的日期 格式:MM-dd)
- @param days 天数
- @param localDate 计算时间
- @return 指定号数之间的所有日期
*/
public static List getDate(int days, LocalDate localDate) {
LocalDate date = null;
List list = new ArrayList<>();
for (int day = days - 1; day > 0; day–) {
date = localDate.minusDays(day);
list.add(date);
}
list.add(localDate);
return list;
}
/**
- 获取指定号数之前的所有日期(指定日期前的日期 格式:MM-dd)
- @param days 天数
- @param localDate 计算时间
- @return 指定号数之间的所有日期
*/
public static List getDateMonthDays(int days, LocalDate localDate, DateTimeFormatter formatter) {
LocalDate date = null;
List list = new ArrayList<>();
for (int day = days - 1; day > 0; day–) {
date = localDate.minusDays(day);
list.add(date.format(formatter));
}
list.add(localDate.format(formatter));
return list;
}
/**
- 获取指定号数之后的所有日期(指定日期后的日期)
- @param days 天数
- @param localDate 计算时间
- @return 指定号数之间的所有日期
*/
public static List getAfterDateMonthDays(int days, LocalDate localDate) {
LocalDate date = null;
List list = new ArrayList<>();
for (int day = 0; day <= days; day++) {
date = localDate.plusDays(day);
list.add(date);
}
return list;
}
/**
- 获取月份所属季节
- @param month 月份
- @return 季节
*/
public static String getSeasonByMonth(Integer month) {
if (null == month || month > 12 || month < 1) {
Asserts.fail(DateUtilConstant.PARAMETER_ERRORS);
}
String season = null;
if (DateUtilConstant.SPRING_MONTH.contains(month)) {
season = DateUtilConstant.SPRING;
} else if (DateUtilConstant.SUMMER_MONTH.contains(month)) {
season = DateUtilConstant.SUMMER;
} else if (DateUtilConstant.AUTUMN_MONTH.contains(month)) {
season = DateUtilConstant.AUTUMN;
} else {
season = DateUtilConstant.WINTER;
}
return season;
}
/**
- 获取所属旬开始时间
- @param date
- @return
*/
public static LocalDateTime getTenDayStartTime(LocalDateTime date) {
int ten = getDayBelongXunReturnInteger(date.getDayOfMonth());
if (ten == 1) {
return LocalDateTime.of(LocalDate.from(date.with(TemporalAdjusters.firstDayOfMonth())), LocalTime.MIN);
} else if (ten == 2) {
return date.withDayOfMonth(11).withHour(0).withMinute(0).withSecond(0);
} else {
return date.withDayOfMonth(21).withHour(0).withMinute(0).withSecond(0);
}
}
/**
- 获取所属旬结束时间
- @param date
- @return
*/
public static LocalDateTime getTenDayEndTime(LocalDateTime date) {
int ten = getDayBelongXunReturnInteger(date.getDayOfMonth());
if (ten == 1) {
return date.withDayOfMonth(10).withHour(23).withMinute(59).withSecond(59);
} else if (ten == 2) {
return date.withDayOfMonth(20).withHour(23).withMinute(59).withSecond(59);
} else {
return LocalDateTime.of(LocalDate.from(date.with(TemporalAdjusters.lastDayOfMonth())), LocalTime.MAX);
}
}
/**
- 获取指定日期前指定年份
- @param localDate 需要计算的时间
- @param years 需要计算的年份数
- @return 年份集合
*/
public static List getDateAllYears(LocalDate localDate, int years) {
LocalDate date = null;
List list = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy”);
for (int day = years - 1; day > 0; day–) {
date = localDate.minusYears(day);
list.add(date.format(formatter));
}
list.add(localDate.format(formatter));
return list;
}
}