package com.qianwen.smartman.common.utils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.DayOfWeek; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Period; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalUnit; import java.time.temporal.WeekFields; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import com.qianwen.smartman.common.constant.DateConstant; import com.qianwen.core.tool.utils.DateUtil; import com.qianwen.smartman.modules.mdc.dto.IntervalDateDto; public class LocalDateTimeUtils { public static String NORMAL_PATTERN = DateConstant.PATTERN_DATE_TIME; public static Long getSecondsByTime(LocalDateTime time) { return Long.valueOf(time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond()); } public static String formatTime(LocalDateTime time, String pattern) { return time.format(DateTimeFormatter.ofPattern(pattern)); } public static String formatTimeLocalDate(LocalDate date, String pattern) { return date.format(DateTimeFormatter.ofPattern(pattern)); } public static String formatNow(String pattern) { return formatTime(LocalDateTime.now(), pattern); } public static LocalDateTime plus(LocalDate localDate, long number, TemporalUnit field) { return localDate.atStartOfDay().plus(number, field); } public static Integer getWeek(LocalDate time) { WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 1); return Integer.valueOf(time.get(weekFields.weekOfYear())); } public static Integer getMonth(LocalDate time) { return Integer.valueOf(time.getMonth().getValue()); } public static Integer getYear(LocalDate time) { return Integer.valueOf(time.getYear()); } public static long betweenTwoTime(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit field) { Period period = Period.between(LocalDate.from((TemporalAccessor) startTime), LocalDate.from((TemporalAccessor) endTime)); if (field == ChronoUnit.YEARS) { return period.getYears(); } if (field == ChronoUnit.MONTHS) { return (period.getYears() * 12) + period.getMonths(); } return field.between(startTime, endTime); } public static LocalDateTime getDayStart(LocalDateTime time) { return time.withHour(0).withMinute(0).withSecond(0).withNano(0); } public static LocalDateTime getDayEnd(LocalDateTime time) { return time.withHour(23).withMinute(59).withSecond(59).withNano(999999999); } /** * 计算一年的天数 * @param year 年份 * @return year指定的年份总天数 */ public static Integer getDayOfYear(Integer year) { return Integer.valueOf(LocalDate.of(year, 1, 1).isLeapYear() ? 366 : 365); } /** * 计算2个日期天数的差 endDate-startDate * @param startDate * @param endDate * @return */ public static Integer getDifference(LocalDate startDate, LocalDate endDate) { Long l = Long.valueOf(endDate.toEpochDay() - startDate.toEpochDay());//l.intValue() Integer difference = Integer.valueOf(Integer.parseInt(l.toString())); return difference; } public static LocalDate getLastDayOfYear(LocalDate date) { LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear()); return lastDayOfYear; } public static Date LocalDateTimeToDate(LocalDateTime localDateTime) { ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = localDateTime.atZone(zoneId); Date date = Date.from(zdt.toInstant()); return date; } public static Date LocalDateToDate(LocalDate localDate) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDate.atStartOfDay().atZone(zone).toInstant(); Date date = Date.from(instant); return date; } public static Date LocalTimeToDate(LocalTime localTime) { LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); Date date = Date.from(instant); return date; } public static LocalDateTime DateToLocalDateTime(Date date) { Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); return localDateTime; } public static LocalDate dateToLocalDate(Date date) { Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); LocalDate localDate = localDateTime.toLocalDate(); return localDate; } public static LocalTime DateToLocalTime(Date date) { Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); LocalTime localTime = localDateTime.toLocalTime(); return localTime; } public static List getIntervalDate(LocalDate startDate, LocalDate endDate) { List intervalDateDtoList = new ArrayList<>(); int startYear = startDate.getYear(); int endYear = endDate.getYear(); for (int i = startYear; i <= endYear; i++) { IntervalDateDto intervalDateDto = new IntervalDateDto(); intervalDateDto.setYear(Integer.valueOf(i)); List weekList = new ArrayList<>(); List monthList = new ArrayList<>(); List dayList = new ArrayList<>(); Integer startWeek = getWeek(startDate); Integer endWeek = getWeek(endDate); if (startYear == endYear) { int startMonth = startDate.getMonth().getValue(); int endMonth = endDate.getMonth().getValue(); for (int n = startMonth; n <= endMonth; n++) { monthList.add(Integer.valueOf(n)); } for (int m = startWeek.intValue(); m <= endWeek.intValue(); m++) { weekList.add(Integer.valueOf(m)); } } else if (i == startYear) { for (int j = startDate.getMonthValue(); j <= 12; j++) { monthList.add(Integer.valueOf(j)); } for (int j2 = startWeek.intValue(); j2 <= 53; j2++) { weekList.add(Integer.valueOf(j2)); } } else if (i == endYear) { for (int j3 = 1; j3 <= endDate.getMonthValue(); j3++) { monthList.add(Integer.valueOf(j3)); } for (int j4 = 1; j4 <= endWeek.intValue(); j4++) { weekList.add(Integer.valueOf(j4)); } } else { for (int l = 1; l <= 12; l++) { monthList.add(Integer.valueOf(l)); } for (int k = 1; k <= 53; k++) { weekList.add(Integer.valueOf(k)); } } DateFormat dateFormat = new SimpleDateFormat(DateConstant.PATTERN_DATE); Calendar tempStart = Calendar.getInstance(); tempStart.setTime(DateUtil.toDate(startDate)); Calendar tempEnd = Calendar.getInstance(); tempEnd.setTime(DateUtil.toDate(endDate)); tempEnd.add(5, 1); while (tempStart.before(tempEnd)) { dayList.add(dateFormat.format(tempStart.getTime())); tempStart.add(6, 1); } intervalDateDto.setMonthList(monthList); intervalDateDto.setWeekList(weekList); intervalDateDto.setDayList(dayList); intervalDateDtoList.add(intervalDateDto); } return intervalDateDtoList; } public static List getIntervalDateReverse(LocalDate startDate, LocalDate endDate) { List intervalDateDtoList = new ArrayList<>(); int startYear = startDate.getYear(); int endYear = endDate.getYear(); for (int i = endYear; i >= startYear; i--) { IntervalDateDto intervalDateDto = new IntervalDateDto(); intervalDateDto.setYear(Integer.valueOf(i)); List weekList = new ArrayList<>(); List monthList = new ArrayList<>(); List dayList = new ArrayList<>(); Integer startWeek = getWeek(startDate); Integer endWeek = getWeek(endDate); if (startYear == endYear) { int startMonth = startDate.getMonth().getValue(); int endMonth = endDate.getMonth().getValue(); for (int n = endMonth; n >= startMonth; n--) { monthList.add(Integer.valueOf(n)); } for (int m = endWeek.intValue(); m >= startWeek.intValue(); m--) { weekList.add(Integer.valueOf(m)); } } else if (i == startYear) { for (int j = 12; j >= startDate.getMonthValue(); j--) { monthList.add(Integer.valueOf(j)); } for (int j2 = 53; j2 >= startWeek.intValue(); j2--) { weekList.add(Integer.valueOf(j2)); } } else if (i == endYear) { for (int j3 = endDate.getMonthValue(); j3 >= 1; j3--) { monthList.add(Integer.valueOf(j3)); } for (int j4 = endWeek.intValue(); j4 >= 1; j4--) { weekList.add(Integer.valueOf(j4)); } } else { for (int l = 12; l >= 1; l--) { monthList.add(Integer.valueOf(l)); } for (int k = 53; k >= 1; k--) { weekList.add(Integer.valueOf(k)); } } DateFormat dateFormat = new SimpleDateFormat(DateConstant.PATTERN_DATE); Calendar tempStart = Calendar.getInstance(); tempStart.setTime(DateUtil.toDate(startDate)); Calendar tempEnd = Calendar.getInstance(); tempEnd.setTime(DateUtil.toDate(endDate)); tempStart.add(5, -1); while (tempEnd.after(tempStart)) { dayList.add(dateFormat.format(tempEnd.getTime())); tempEnd.add(6, -1); } intervalDateDto.setMonthList(monthList); intervalDateDto.setWeekList(weekList); intervalDateDto.setDayList(dayList); intervalDateDtoList.add(intervalDateDto); } return intervalDateDtoList; } public static Date getFirstDayDateOfYear(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); int last = cal.getActualMinimum(6); cal.set(6, last); return cal.getTime(); } public static Date getLastDayOfYear(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); int last = cal.getActualMaximum(6); cal.set(6, last); return cal.getTime(); } public static LocalDateTime stringToLocalDateTime(String date) { return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(NORMAL_PATTERN)); } public static List getDateList(LocalDate startDate, LocalDate endDate) { List localDateList = new ArrayList<>(); Integer length = getDifference(startDate, endDate); for (int i = length.intValue(); i >= 0; i--) { localDateList.add(endDate.minusDays(i)); } return localDateList; } }