/*** 日期时间处理类
*
*@authordingxinfa
* @date 2018-08-15
**/
public classDateUtils {/*** 获取当前时间所在星期的年份
*@paramdate
*@return
*/
public static intgetYearOfWeek(Date date) {
Calendar c= newGregorianCalendar();
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);returnc.get(Calendar.YEAR);
}/*** 获取当前时间所在年的周数
*@paramdate
*@return
*/
public static intgetWeekOfYear(Date date) {
Calendar c= newGregorianCalendar();
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
}else{return currWeek
}
}/*** 获取确定年 的最大周数
*@paramyear
*@return
*/
public static int getMaxWeekNumOfYear(intyear) {
Calendar c= newGregorianCalendar();
c.set(year, Calendar.DECEMBER,31, 23, 59, 59);returngetWeekOfYear(c.getTime());
}/*** 获取某年的第几周的开始日期
*@paramyear
*@paramweek
*@return
*/
public static Date getFirstDayOfWeek(int year, intweek) {
Calendar c= newGregorianCalendar();
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);returngetFirstDayOfWeek(cal.getTime());
}/*** 获取某年的第几周的结束日期
*@paramyear
*@paramweek
*@return
*/
public static Date getLastDayOfWeek(int year, intweek) {
Calendar c= newGregorianCalendar();
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);returngetLastDayOfWeek(cal.getTime());
}/*** 获取当前时间所在周的开始日期
*@paramdate
*@return
*/
public staticDate getFirstDayOfWeek(Date date) {
Calendar c= newGregorianCalendar();
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);returnc.getTime();
}/*** 获取当前时间所在周的结束日期
*@paramdate
*@return
*/
public staticDate getLastDayOfWeek(Date date) {
Calendar c= newGregorianCalendar();
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);returnc.getTime();
}/*** 获取当前时间所在月份的开始日期
*@paramdate
*@return
*/
public staticDate getFirstDayOfMonth(Date date) {
Calendar c= newGregorianCalendar();
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);returnc.getTime();
}/*** 获取当前时间所在月份的结束日期
*@paramdate
*@return
*/
public staticDate getLastDayOfMonth(Date date) {
Calendar c= newGregorianCalendar();
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);returnc.getTime();
}/*** 获取某年第几月的开始日期
*@paramyear
*@parammonth
*@return
*/
public static Date getFirstDayOfMonth(int year, intmonth) {
Calendar cal= newGregorianCalendar();
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);returncal.getTime();
}/*** 获取某年第几月的结束日期
*@paramyear
*@parammonth
*@return
*/
public static Date getLastDayOfMonth(int year, intmonth) {
Calendar cal= newGregorianCalendar();
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);returncal.getTime();
}/*** 获取今天开始时间
*@return
*/
public staticDate getTodayStartTime() {
Calendar cal= newGregorianCalendar();
cal.setTime(newDate());
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);returncal.getTime();
}/*** 获取今天结束时间
*@return
*/
public staticDate getTodayEndTime() {
Calendar cal= newGregorianCalendar();
cal.setTime(newDate());
cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,999);returncal.getTime();
}/*** 获取某一时间开始时间
*@paramdate 某天的某一时间
*@return
*/
public staticDate getOneDayStartTime(Date date) {
Calendar cal= newGregorianCalendar();
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);returncal.getTime();
}/*** 获取某一时间结束时间
*@paramdate 某天的某一时间
*@return
*/
public staticDate getOneDayEndTime(Date date) {
Calendar cal= newGregorianCalendar();
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);returncal.getTime();
}/*** date2比date1多的天数
*@paramdate1
*@paramdate2
*@return
*/
public static intdifferentDays(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;
}
}/*** 获取两个日期相差的月数
*@parammaxTime 较大的日期
*@paramminTime 较小的日期
*@return如果d1>d2返回 月数差 否则返回0*/
public static intdifferentMonths( Date minTime,Date maxTime) {
Calendar c1=Calendar.getInstance();
Calendar c2=Calendar.getInstance();
c1.setTime(maxTime);
c2.setTime(minTime);if(c1.getTimeInMillis()
}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;
}/*** 将毫秒数 转换成 格式化时间
*@paramtime
*@return
*/
public static String formatMillisecond(longtime){return formatSecond(time/1000);
}/*** 将秒数 转换成 格式化时间
*@paramtime
*@return
*/
public static String formatSecond(longtime){return formatSecond(time,"天" ,"小时","分钟","秒");
}/*** 将秒数 转换成 格式化时间
*@paramtime
*@return
*/
public static String formatSecond(longtime,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=newStringBuilder();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);
}returnformatTime.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
*@paramstartLocalDateTime
*@paramendLocalDateTime
*@return
*/
public static ListgetLocalDateTimeIntervalMonthStartEndTime(LocalDateTime startLocalDateTime,LocalDateTime endLocalDateTime){if(startLocalDateTime.isAfter(endLocalDateTime)){
LocalDateTime temp=startLocalDateTime;
startLocalDateTime=endLocalDateTime;
endLocalDateTime=temp;
}
List 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(newLocalDateTime[]{currDateTime, currMonthEndDateTime});
}else{
localDateTimeList.add(newLocalDateTime[]{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(newLocalDateTime[]{currDateTime, currMonthEndDateTime});
}else{if(currDateTime.isBefore(endLocalDateTime)) {
localDateTimeList.add(newLocalDateTime[]{currDateTime, endLocalDateTime});
}
}
}while(currMonthEndDateTime.isBefore(endLocalDateTime));returnlocalDateTimeList;
}public static voidmain(String[] args) {
List 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());
}
}