All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.lulihu.dateTime.DateCalculateKit Maven / Gradle / Ivy

package net.lulihu.dateTime;

import lombok.extern.slf4j.Slf4j;
import net.lulihu.ObjectKit.CollectionKit;
import net.lulihu.ObjectKit.StrKit;
import net.lulihu.exception.ToolBoxException;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 时间计算工具类
 */
@Slf4j
public class DateCalculateKit {

    /**
     * 寻找最大时间,并且转换当天的时间
     * 

* 传入的时间转换为 HH:mm * * @param times 多个时间 */ public static DateTime findBiggestTime(List times) { String biggestTime = findBiggestTime(times, "HH:mm"); String format = DateTimeKit.format(DateTimeKit.date(), "HH:mm:00 yyyy-MM-dd"); return DateTimeKit.parse(biggestTime + format.substring(5), "HH:mm:ss yyyy-MM-dd"); } /** * 寻找最大的时间 * * @param times 多个时间 * @param pattern 日期转换表达式 */ public static String findBiggestTime(List times, String pattern) { if (CollectionKit.isEmpty(times) || StrKit.isEmpty(pattern)) return null; if (times.size() == 1) { return times.get(0); } times.sort((o1, o2) -> compareDate(DateTimeKit.parse(o2, pattern), DateTimeKit.parse(o1, pattern))); return times.get(0); } /** * 判断时间是否在时间段内 * * @param nowTime 当前时间 * @param beginTime 开始时间 * @param endTime 结束时间 * @param format 时间格式 */ public static boolean intervalJudgment(String nowTime, String beginTime, String endTime, String format) { return intervalJudgment( DateTimeKit.parse(nowTime, format), DateTimeKit.parse(beginTime, format), DateTimeKit.parse(endTime, format) ); } /** * 判断时间是否在时间段内 * * @param nowTime 当前时间 * @param beginTime 开始时间 * @param endTime 结束时间 */ public static boolean intervalJudgment(Date nowTime, Date beginTime, Date endTime) { Calendar date = Calendar.getInstance(); date.setTime(nowTime); Calendar begin = Calendar.getInstance(); begin.setTime(beginTime); Calendar end = Calendar.getInstance(); end.setTime(endTime); return date.after(begin) && date.before(end); } /** * 时间转cron表达式 * 小于10的数字之前的0将会被去除 * * @param date 时间对象 */ public static String dateToCron(Date date) { String format1 = DateTimeKit.format(date, "ss mm HH dd MM"); String format2 = DateTimeKit.format(date, "? yyyy"); StringBuilder builder = new StringBuilder(); for (String str : format1.split(" ")) { Integer value = Integer.valueOf(str); builder.append(value).append(" "); } builder.append(format2); return builder.toString(); } /** * 比较两个时间大小,
* DATE1大于DATE2 返回1
* DATE1小于DATE2 返回-1
* 相等返回 0
*/ public static int compareDate(Date DATE1, Date DATE2) { return Long.compare(DATE1.getTime(), DATE2.getTime()); } /** * 计算两个日期相差年数 * * @param startDate 开始时间 * @param endDate 结束时间 * @return */ public static int yearDateDiff(String startDate, String endDate) { Calendar calBegin = Calendar.getInstance(); Calendar calEnd = Calendar.getInstance(); calBegin.setTime(DateTimeKit.parse(startDate, "yyyy")); calEnd.setTime(DateTimeKit.parse(endDate, "yyyy")); return calEnd.get(Calendar.YEAR) - calBegin.get(Calendar.YEAR); } /** * 获取指定时间周的第一天与最后一天 *

* 一周的第一天为 星期日,最后一天为星期六 * * @param time 指定时间 * @return 返回一个长度为2的数组 */ public static String[] weekStartAndEnd(Date time) { SimpleDateFormat dateFormat = DateTimeKit.NORM_DATE_FORMAT.get(); Calendar cal = Calendar.getInstance(); cal.setTime(time); // 获得当前日期是一个星期的第几天 int dayWeek = cal.get(Calendar.DAY_OF_WEEK); // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } // 设置一个星期的第一天,为星期日 cal.setFirstDayOfWeek(Calendar.SUNDAY); // 根据日历的规则,给指定日期减去星期几与一个星期第一天的差值 cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - cal.get(Calendar.DAY_OF_WEEK)); String imptimeBegin = dateFormat.format(cal.getTime()); cal.add(Calendar.DATE, 6); String imptimeEnd = dateFormat.format(cal.getTime()); return new String[]{imptimeBegin, imptimeEnd}; } /** * 获取某一时间段内每周指定星期的日期 * * @param dateFrom 开始时间 * @param dateEnd 结束时间 * @param weekDays 星期 多个用 | 隔开 * @return 返回时间数组 每组时间为一个字符串 */ public static List weekDays(String dateFrom, String dateEnd, String weekDays, String separator) { //得到对应星期的系数 String[] strWeeks = weekDays.split("\\|"); String strWeekNumber = weekForNum(strWeeks); int len = strWeeks.length; List result = new ArrayList<>(); SimpleDateFormat dateFormat = DateTimeKit.NORM_DATE_FORMAT.get(); dateFrom = dateFormat.format( DateTimeKit.parse(dateFrom).getTime() - DateTimeKit.DAY_MS); StringBuilder builder = new StringBuilder(); while (true) { Date date = new Date(DateTimeKit.parse(dateFrom).getTime() + DateTimeKit.DAY_MS); dateFrom = dateFormat.format(date); if (dateFrom.compareTo(dateEnd) <= 0) { //查询的某一时间的星期系数 Integer weekDay = dayForWeek(date); //判断当期日期的星期系数是否是需要查询的 if (strWeekNumber.contains(weekDay.toString())) { builder.append(dateFrom).append(separator); if (len == 0 || weekDay == 7) { result.add(builder.substring(0, builder.length() - separator.length())); builder = new StringBuilder(); len = strWeeks.length; } len--; } } else break; } return result; } /** * 得到对应星期的系数 星期日:1,星期一:2,星期二:3,星期三:4,星期四:5,星期五:6,星期六:7 * * @param strWeeks 星期格式 */ public static String weekForNum(String... strWeeks) { StringBuilder weekNumber = new StringBuilder(); for (String strWeek : strWeeks) { weekNumber.append(getWeekNum(strWeek)); } return weekNumber.toString(); } /** * 等到当期时间的周系数 * * @param date 星期日:1,星期一:2,星期二:3,星期三:4,星期四:5,星期五:6,星期六:7 * @return */ public static Integer dayForWeek(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DAY_OF_WEEK); } /** * 将星期转换为对应的系数 * * @param strWeek 星期日:1, * 星期一:2, * 星期二:3, * 星期三:4, * 星期四:5, * 星期五:6, * 星期六:7 * @return 对应系数 */ public static Integer getWeekNum(String strWeek) { if ("星期日".equals(strWeek)) { return 1; } else if ("星期一".equals(strWeek)) { return 2; } else if ("星期二".equals(strWeek)) { return 3; } else if ("星期三".equals(strWeek)) { return 4; } else if ("星期四".equals(strWeek)) { return 5; } else if ("星期五".equals(strWeek)) { return 6; } else if ("星期六".equals(strWeek)) { return 7; } throw new ToolBoxException("不支持的星期书写方式"); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy