package org.dromara.demo.util; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import org.springframework.util.StringUtils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class PeriodDate { public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd"; //今天 public String today = DateUtil.today(); public DateTime date = DateUtil.date(); //本月 public String month = DateUtil.format(date, "M"); //本周的第一天 public String weekFirst = PeriodDate.getThisWeekOfFirstDate(); //本周的最后一天 public String weekEnd = DateUtil.format(DateUtil.offsetDay(date, 4), "yyyy-MM-dd"); //本月的第一天 public String MonthFirst = PeriodDate.getThisMonthOfFirstDate(0); //本月的最后一天 public String MonthEnd = PeriodDate.getThisMouthLastDay(); //本季度的最后一天 public String lastdateTimSeason = PeriodDate.getCurrQuarter(Integer.valueOf(PeriodDate.getQuarter()))[1]; //本季度的第一天 public String firstdateTimSeason = PeriodDate.getCurrQuarter(Integer.valueOf(PeriodDate.getQuarter()))[0]; //本月天数 public int daysInMonth = PeriodDate.getDaysOfMonth(); public static String changeSqlNotNull(String sql) { String[] strings = sql.split(","); String returnSql = ""; for (String str : strings) { if (str.contains("''")) { returnSql = returnSql + str + ","; } else { returnSql = returnSql + "ifnull(" + str + ",'') " + str + ","; } } return returnSql.substring(0, returnSql.length() - 1); } /** * 获取两个日期之间的所有日期(字符串格式, 按天计算) * * @param startTime String 开始时间 yyyy-MM-dd * @param endTime String 结束时间 yyyy-MM-dd * @return */ public static List getBetweenDays(String startTime, String endTime) throws ParseException { if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) { return null; } //1、定义转换格式 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date start = df.parse(startTime); Date end = df.parse(endTime); if (StringUtils.isEmpty(start) || StringUtils.isEmpty(end)) { return null; } List result = new ArrayList(); Calendar tempStart = Calendar.getInstance(); tempStart.setTime(start); tempStart.add(Calendar.DAY_OF_YEAR, 1); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar tempEnd = Calendar.getInstance(); tempEnd.setTime(end); result.add(sdf.format(start)); while (tempStart.before(tempEnd) || tempStart.equals(tempEnd)) { result.add(sdf.format(tempStart.getTime())); tempStart.add(Calendar.DAY_OF_YEAR, 1); } return result; } /** * 本周的第一天 * * @return */ public static String getThisWeekOfFirstDate() { SimpleDateFormat format = new SimpleDateFormat(FORMAT_YYYY_MM_DD); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); return format.format(calendar.getTime()); } /** * @param i 为0表示本月,为1表示下月,为-1表示上月 * @return * @throws * @Title: DateUtil * @Description: 获取本月当前时间(或者上月下月) * @author lin * @since 2019年12月5日下午4:02:44 */ public static String getTime1(Integer i) { Calendar calendar = Calendar.getInstance(); if (i != null) { calendar.add(Calendar.MONTH, i); } int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DATE); return year + "-" + (month + 1) + "-" + day; } /** * @param //i为0表示本月为1表示下月 * @return * @throws * @Title: DateUtil * @Description: 获取本月第一天(获取本月的第一天) * @author lin * @since 2019年12月5日下午3:59:55 */ public static String getThisMonthOfFirstDate(Integer i) { SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd"); Calendar calendar = Calendar.getInstance(); if (i != null) { calendar.add(Calendar.MONTH, i); } calendar.set(Calendar.DAY_OF_MONTH, Calendar.SUNDAY); return format.format(calendar.getTime()); } /** * 获取本月最后一天 * * @return */ public static String getThisMouthLastDay() { //设置时间格式 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //获得实体类 Calendar ca = Calendar.getInstance(); //设置最后一天 ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH)); //最后一天格式化 String lastDay = format.format(ca.getTime()); return lastDay; } /** * 某一个月第一天和最后一天 * * @param date 指定日期 * @param pattern 日期格式 * @param //isNeedHms是否需要时分秒 * @return */ public static Map getFirstLastDayByMonth(Date date, String pattern, boolean isNeedHms) { SimpleDateFormat df = new SimpleDateFormat(pattern); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Date theDate = calendar.getTime(); // 第一天 GregorianCalendar gcLast = (GregorianCalendar) Calendar.getInstance(); gcLast.setTime(theDate); gcLast.set(Calendar.DAY_OF_MONTH, 1); String day_first = df.format(gcLast.getTime()); StringBuffer str = new StringBuffer().append(day_first); if (isNeedHms) { str.append(" 00:00:00"); } day_first = str.toString(); // 最后一天 calendar.add(Calendar.MONTH, 1); // 加一个月 calendar.set(Calendar.DATE, 1); // 设置为该月第一天 calendar.add(Calendar.DATE, -1); // 再减一天即为上个月最后一天 String day_last = df.format(calendar.getTime()); StringBuffer endStr = new StringBuffer().append(day_last); if (isNeedHms) { endStr.append(" 23:59:59"); } day_last = endStr.toString(); Map map = new HashMap(); map.put("first", day_first); map.put("last", day_last); return map; } /** * 获取当前季度 */ public static String getQuarter() { Calendar c = Calendar.getInstance(); int month = c.get(Calendar.MONTH) + 1; int quarter = 0; if (month >= 1 && month <= 3) { quarter = 1; } else if (month >= 4 && month <= 6) { quarter = 2; } else if (month >= 7 && month <= 9) { quarter = 3; } else { quarter = 4; } return quarter + ""; } /** * 获取某季度的第一天和最后一天 * * @param //num第几季度 */ public static String[] getCurrQuarter(int num) { String[] s = new String[2]; String str = ""; // 设置本年的季 Calendar quarterCalendar = null; switch (num) { case 1: // 本年到现在经过了一个季度,在加上前4个季度 quarterCalendar = Calendar.getInstance(); quarterCalendar.set(Calendar.MONTH, 3); quarterCalendar.set(Calendar.DATE, 1); quarterCalendar.add(Calendar.DATE, -1); str = PeriodDate.formatDate(quarterCalendar.getTime(), "yyyy-MM-dd"); s[0] = str.substring(0, str.length() - 5) + "01-01"; s[1] = str; break; case 2: // 本年到现在经过了二个季度,在加上前三个季度 quarterCalendar = Calendar.getInstance(); quarterCalendar.set(Calendar.MONTH, 6); quarterCalendar.set(Calendar.DATE, 1); quarterCalendar.add(Calendar.DATE, -1); str = PeriodDate.formatDate(quarterCalendar.getTime(), "yyyy-MM-dd"); s[0] = str.substring(0, str.length() - 5) + "04-01"; s[1] = str; break; case 3:// 本年到现在经过了三个季度,在加上前二个季度 quarterCalendar = Calendar.getInstance(); quarterCalendar.set(Calendar.MONTH, 9); quarterCalendar.set(Calendar.DATE, 1); quarterCalendar.add(Calendar.DATE, -1); str = PeriodDate.formatDate(quarterCalendar.getTime(), "yyyy-MM-dd"); s[0] = str.substring(0, str.length() - 5) + "07-01"; s[1] = str; break; case 4:// 本年到现在经过了四个季度,在加上前一个季度 quarterCalendar = Calendar.getInstance(); str = PeriodDate.formatDate(quarterCalendar.getTime(), "yyyy-MM-dd"); s[0] = str.substring(0, str.length() - 5) + "10-01"; s[1] = str.substring(0, str.length() - 5) + "12-31"; break; } return s; } /** * 用途:以指定的格式格式化日期字符串 * * @param pattern 字符串的格式 * @param currentDate 被格式化日期 * @return String 已格式化的日期字符串 * @throws NullPointerException 如果参数为空 */ public static String formatDate(Date currentDate, String pattern) { if (currentDate == null || "".equals(pattern) || pattern == null) { return null; } SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.format(currentDate); } /** * @return java.util.List * @Author Lin * @Description * @Date 2021/3/10 14:17 * @Param [] **/ public static List getStartDateToEndDate(String startDate, String endDate) { List betweenDays = null; try { betweenDays = PeriodDate.getBetweenDays(startDate, endDate); System.out.println(betweenDays); } catch (ParseException e) { e.printStackTrace(); } return betweenDays; } /** * @return int * @Author Lin * @Description 本月天数 * @Date 2021/3/10 14:48 * @Param [date] **/ public static int getDaysOfMonth() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } }