/** * 日期时间处理类 * * @author dingxinfa * @date 2018-08-15 **/ public class DateUtils { /** * 获取当前时间所在星期的年份 * @param date * @return */ public static int getYearOfWeek(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.setTime(date); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); c.set(Calendar.HOUR_OF_DAY,0); c.set(Calendar.MINUTE,0); c.set(Calendar.SECOND,0); c.set(Calendar.MILLISECOND,0); return c.get(Calendar.YEAR); } /** * 获取当前时间所在年的周数 * @param date * @return */ public static int getWeekOfYear(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.setTime(date); int currYear = c.get(Calendar.YEAR); int currWeek = c.get(Calendar.WEEK_OF_YEAR); c.add(Calendar.DATE, 7); int nextWeek=c.get(Calendar.WEEK_OF_YEAR); int nextYear=c.get(Calendar.YEAR); if (currYear<nextYear){ return currWeek; }else{ return currWeek<nextWeek?currWeek:nextWeek-1; } } /** * 获取确定年 的最大周数 * @param year * @return */ public static int getMaxWeekNumOfYear(int year) { Calendar c = new GregorianCalendar(); c.set(year, Calendar.DECEMBER, 31, 23, 59, 59); return getWeekOfYear(c.getTime()); } /** * 获取某年的第几周的开始日期 * @param year * @param week * @return */ public static Date getFirstDayOfWeek(int year, int week) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.set(Calendar.YEAR, year); c.set(Calendar.WEEK_OF_YEAR, week); c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); Calendar cal = (GregorianCalendar) c.clone(); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE,0); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); return getFirstDayOfWeek(cal.getTime()); } /** * 获取某年的第几周的结束日期 * @param year * @param week * @return */ public static Date getLastDayOfWeek(int year, int week) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.set(Calendar.YEAR, year); c.set(Calendar.WEEK_OF_YEAR, week); c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); Calendar cal = (GregorianCalendar) c.clone(); cal.set(Calendar.HOUR_OF_DAY,23); cal.set(Calendar.MINUTE,59); cal.set(Calendar.SECOND,59); cal.set(Calendar.MILLISECOND,999); return getLastDayOfWeek(cal.getTime()); } /** * 获取当前时间所在周的开始日期 * @param date * @return */ public static Date getFirstDayOfWeek(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.setTime(date); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); c.set(Calendar.HOUR_OF_DAY,0); c.set(Calendar.MINUTE,0); c.set(Calendar.SECOND,0); c.set(Calendar.MILLISECOND,0); return c.getTime(); } /** * 获取当前时间所在周的结束日期 * @param date * @return */ public static Date getLastDayOfWeek(Date date) { Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.setTime(date); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); c.set(Calendar.HOUR_OF_DAY,23); c.set(Calendar.MINUTE,59); c.set(Calendar.SECOND,59); c.set(Calendar.MILLISECOND,999); return c.getTime(); } /** * 获取当前时间所在月份的开始日期 * @param date * @return */ public static Date getFirstDayOfMonth(Date date) { Calendar c = new GregorianCalendar(); c.setTime(date); c.set(Calendar.DAY_OF_MONTH, 1); c.set(Calendar.HOUR_OF_DAY,0); c.set(Calendar.MINUTE,0); c.set(Calendar.SECOND,0); c.set(Calendar.MILLISECOND,0); return c.getTime(); } /** * 获取当前时间所在月份的结束日期 * @param date * @return */ public static Date getLastDayOfMonth(Date date) { Calendar c = new GregorianCalendar(); c.setTime(date); //获取某月最大天数 int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH); c.set(Calendar.DAY_OF_MONTH, lastDay); c.set(Calendar.HOUR_OF_DAY,23); c.set(Calendar.MINUTE,59); c.set(Calendar.SECOND,59); c.set(Calendar.MILLISECOND,999); return c.getTime(); } /** * 获取某年第几月的开始日期 * @param year * @param month * @return */ public static Date getFirstDayOfMonth(int year, int month) { Calendar cal = new GregorianCalendar(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH,month); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE,0); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); return cal.getTime(); } /** * 获取某年第几月的结束日期 * @param year * @param month * @return */ public static Date getLastDayOfMonth(int year, int month) { Calendar cal = new GregorianCalendar(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH,month); //获取某月最大天数 int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); cal.set(Calendar.DAY_OF_MONTH, lastDay); cal.set(Calendar.HOUR_OF_DAY,23); cal.set(Calendar.MINUTE,59); cal.set(Calendar.SECOND,59); cal.set(Calendar.MILLISECOND,999); return cal.getTime(); } /** * 获取今天开始时间 * @return */ public static Date getTodayStartTime() { Calendar cal = new GregorianCalendar(); cal.setTime(new Date()); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE,0); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); return cal.getTime(); } /** * 获取今天结束时间 * @return */ public static Date getTodayEndTime() { Calendar cal = new GregorianCalendar(); cal.setTime(new Date()); cal.set(Calendar.HOUR_OF_DAY,23); cal.set(Calendar.MINUTE,59); cal.set(Calendar.SECOND,59); cal.set(Calendar.MILLISECOND,999); return cal.getTime(); } /** * 获取某一时间开始时间 * @param date 某天的某一时间 * @return */ public static Date getOneDayStartTime(Date date) { Calendar cal = new GregorianCalendar(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE,0); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); return cal.getTime(); } /** * 获取某一时间结束时间 * @param date 某天的某一时间 * @return */ public static Date getOneDayEndTime(Date date) { Calendar cal = new GregorianCalendar(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY,23); cal.set(Calendar.MINUTE,59); cal.set(Calendar.SECOND,59); cal.set(Calendar.MILLISECOND,999); return cal.getTime(); } /** * date2比date1多的天数 * @param date1 * @param date2 * @return */ public static int differentDays(Date date1,Date date2) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(date1); Calendar cal2 = Calendar.getInstance(); cal2.setTime(date2); int day1= cal1.get(Calendar.DAY_OF_YEAR); int day2 = cal2.get(Calendar.DAY_OF_YEAR); int year1 = cal1.get(Calendar.YEAR); int year2 = cal2.get(Calendar.YEAR); if(year1 != year2){ //不同年份 int timeDistance = 0 ; for(int i = year1 ; i < year2 ; i ++){ if(i%4==0 && i%100!=0){ //闰年 timeDistance += 366; } else if (i%400==0) { //闰年 timeDistance += 366; }else{ //非闰年 timeDistance += 365; } } return timeDistance + (day2-day1) ; } else { //同一年份 return day2-day1; } } /** * 获取两个日期相差的月数 * @param maxTime 较大的日期 * @param minTime 较小的日期 * @return 如果d1>d2返回 月数差 否则返回0 */ public static int differentMonths( Date minTime,Date maxTime) { Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); c1.setTime(maxTime); c2.setTime(minTime); if(c1.getTimeInMillis() < c2.getTimeInMillis()) { return 0; } int year1 = c1.get(Calendar.YEAR); int year2 = c2.get(Calendar.YEAR); int month1 = c1.get(Calendar.MONTH); int month2 = c2.get(Calendar.MONTH); int monthInterval =0; int yearInterval =0; if (month1>=month2){ yearInterval = year1 - year2; monthInterval = month1 - month2 ; }else{ yearInterval = year1 - year2-1; monthInterval = (month1+12) - month2 ; } return yearInterval * 12 + monthInterval; } /** * 将毫秒数 转换成 格式化时间 * @param time * @return */ public static String formatMillisecond(long time){ return formatSecond(time/1000); } /** * 将秒数 转换成 格式化时间 * @param time * @return */ public static String formatSecond(long time){ return formatSecond(time,"天" ,"小时","分钟","秒"); } /** * 将秒数 转换成 格式化时间 * @param time * @return */ public static String formatSecond(long time,String dayFormat,String hourFormat,String minuteFormat,String secondFormat) { int mi = 60; int hh = mi * 60; int dd = hh * 24; long day = time / dd; long hour = (time%dd) / hh; long minute = (time%hh) / mi; long second = time%mi; StringBuilder formatTime=new StringBuilder(); if (day>0){ formatTime.append(day).append(dayFormat); } if (hour>0 || ((second>0 || minute>0)&& day > 0)){ formatTime.append(hour).append(hourFormat); } if (minute>0 ||((hour>0 ||day > 0) && second>0)){ formatTime.append(minute).append(minuteFormat); } if (second>0){ formatTime.append(second).append(secondFormat); } return formatTime.toString(); } /*** * 获取时间区间 月份开始|结束 时间列表 * 示例 * param * startLocalDateTime 2020-03-02 12:22:22 * endLocalDateTime 2020-05-22 18:18:18 * return * 2020-03-02 12:22:22,2020-03-31 23:59:59.999 * 2020-04-01 00:00:00,2020-04-30 23:59:59.999 * 2020-05-01 00:00:00,2020-05-22 18:18:18 * @param startLocalDateTime * @param endLocalDateTime * @return */ public static List<LocalDateTime[]> getLocalDateTimeIntervalMonthStartEndTime(LocalDateTime startLocalDateTime,LocalDateTime endLocalDateTime){ if (startLocalDateTime.isAfter(endLocalDateTime)){ LocalDateTime temp=startLocalDateTime; startLocalDateTime=endLocalDateTime; endLocalDateTime=temp; } List<LocalDateTime[]> localDateTimeList=new ArrayList<>(); LocalDateTime currDateTime=startLocalDateTime; LocalDateTime currMonthEndDateTime = LocalDateTime.of(LocalDate.of(currDateTime.getYear(),currDateTime.getMonth(),currDateTime.getDayOfMonth()), LocalTime.MAX).with(TemporalAdjusters.lastDayOfMonth()); if (currMonthEndDateTime.isBefore(endLocalDateTime)) { localDateTimeList.add(new LocalDateTime[]{currDateTime, currMonthEndDateTime}); } else { localDateTimeList.add(new LocalDateTime[]{startLocalDateTime, endLocalDateTime}); } do{ currDateTime = LocalDateTime.of(LocalDate.of(currDateTime.getYear(),currDateTime.getMonth(),currDateTime.getDayOfMonth()), LocalTime.MIN).with(TemporalAdjusters.firstDayOfNextMonth()); currMonthEndDateTime = LocalDateTime.of(LocalDate.of(currDateTime.getYear(),currDateTime.getMonth(),currDateTime.getDayOfMonth()), LocalTime.MAX).with(TemporalAdjusters.lastDayOfMonth()); if (currMonthEndDateTime.isBefore(endLocalDateTime)) { localDateTimeList.add(new LocalDateTime[]{currDateTime, currMonthEndDateTime}); } else { if (currDateTime.isBefore(endLocalDateTime)) { localDateTimeList.add(new LocalDateTime[]{currDateTime, endLocalDateTime}); } } }while(currMonthEndDateTime.isBefore(endLocalDateTime)); return localDateTimeList; } public static void main(String[] args) { List<LocalDateTime[]> localDateTimeList=getLocalDateTimeIntervalMonthStartEndTime(LocalDateTime.of(2020,5,30,12,12,12,256),LocalDateTime.of(2020,5,30,12,12,12,888)); System.out.println(localDateTimeList.toArray().toString()); } }