时间处理的工具类



import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;


import jodd.datetime.JDateTime;


/**
 *
 * 用于时间处理的工具,依赖于apache的commons-lang3,以@Component的形式存在于Spring容器中,调用时应在上下文环境中进行注入。
 *
 * @author 
 *
 * <p><strong>最近修改者:</strong>$Author:  $</p>
 * <p><strong>最近修改于:</strong>$Date: 2015-04-16 15:13:24 +0800 (星期四, 16 四月 2015) $</p>
 * <p><strong>当前库版本:</strong>$Rev: 2356 $</p>
 *
 * 
 */
@Component("dateUtil")
public class DateUtil {
    private String defaultDateFormat = "yyyy-MM-dd HH:mm:ss";
    private String dateFormat = "yyyy-MM-dd";
    private ConcurrentHashMap<String, List<String>> todayAxisCache = new ConcurrentHashMap<String, List<String>>(1);
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    @Autowired
    private ChartUtil chartUtil;
    /**
     * 给定一个时间对象,返回此时间当天的0点0分0秒。
     *
     * @param date
     *          某一时间
     * @return
     *          当天的0点0分0秒的时间对象
     */
    public Date truncate(final Date date) {
        if(null != date) {
            return DateUtils.truncate(date, Calendar.DAY_OF_MONTH);
        }
        return null;
    }


    /**
     * 给定一个时间对象,返回此时间当天下一天的0点0分0秒。
     *
     * @param date
     *          某一时间
     * @return
     *          当天的下一天的0点0分0秒的时间对象。
     */
    public Date ceiling(final Date date) {
        if(null != date) {
            return DateUtils.ceiling(date, Calendar.DAY_OF_MONTH);
        }
        return null;
    }


    /**
     * 将日期对象转换为指定format格式的字符串
     *
     * @param date
     * @param format
     * @return
     */
    public String fromDate(final Date date, String format) {
        if(null == date) {
            return null;
        }
        if(null != format && 0 != format.trim().length()) {
            return DateFormatUtils.format(date, format);
        } else {
            return DateFormatUtils.format(date, defaultDateFormat);
        }
    }


    /**
     * 将一个日期对象转换为格式如yyyy-MM-dd hh:mm:ss的字符串
     * @param date
     * @return
     */
    public String fromDate(final Date date) {
        return fromDate(date, null);
    }


    /**
     * 将一个依指定格式的字符串日期转换为Date对象
     * @param date
     *          日期字符串,如为null,则返回null
     * @param format
     *          日期格式,如为null,则默认指定为yyyy-MM-dd hh:mm:ss
     * @return
     *          日期对象
     */
    public Date toDate(final String date, final String format) {
        Date d = null;
        try {
            if(null != date) {
                if(null != format) {
                    d = DateUtils.parseDate(date, format);
                } else {
                    d = DateUtils.parseDate(date, defaultDateFormat);
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return d;
    }


    /**
     * 将一个日期字符串依默认格式yyyy-MM-dd hh:mm:ss转换为Date对象
     * @param date
     * @return
     */
    public Date toDate(final String date) {
        return toDate(date, null);
    }
    /**
     * 以interval为时间间隔,平均分割date1和date2这段区域的时间
     * @param date1
     * @param date2
     * @param interval
     * @return
     */
    public List<String> dividePeriodOfTimeByInterval(Date date1, Date date2, int interval){
    Date truncateDate1 = null;
Date truncateDate2 = null;
if(null != date1) {
truncateDate1 = DateUtils.truncate(date1, Calendar.DAY_OF_MONTH);
} else {
truncateDate1 = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
}
if(null != date2) {
truncateDate2 = DateUtils.truncate(date2, Calendar.DAY_OF_MONTH);
} else {
truncateDate2 = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
}
String cacheKey = DateFormatUtils.format(truncateDate1, ChartUtil.TIME_FORMAT_DEFAULT);
String cacheKeyToo = DateFormatUtils.format(truncateDate2, ChartUtil.TIME_FORMAT_DEFAULT);
List<String> expectedValue = todayAxisCache.get(cacheKey);
List<String> expectedValueToo = todayAxisCache.get(cacheKeyToo);
if (null != expectedValue && null != expectedValueToo) {
return expectedValue;
} else {
synchronized (todayAxisCache) {
todayAxisCache.clear();
List<String> newValue = new ArrayList<String>();
try {
//以interval为时间间隔,划分从date1到date2的时间段,返回字符串形式的日期的集合
newValue = chartUtil.timeAxisForPeriodDateByInterval(interval, date1, date2);
} catch (Exception e) {
e.printStackTrace();
}
todayAxisCache.putIfAbsent(cacheKey, newValue);
return newValue;
}


}
   
    }


    /**
     * 给定当前日期 month个月后(前)第一天的日期(month可以为负数)
     *
     * @param date
     * @param month
     * @return
     */
    public String getAfterMonthFirstDayDate(String date, int month) {
         Calendar c = Calendar.getInstance();
         SimpleDateFormat simpleFormat = new SimpleDateFormat(dateFormat);
         Date dat = null;
         try {
              dat = simpleFormat.parse(date);
         } catch (Exception e) {


         }
         c.setTime(dat);
         c.add(Calendar.MONTH, month);
         String afterMonthFirstDayDate = simpleFormat.format(c.getTime());


         return afterMonthFirstDayDate;
    }


    /**
     * 给定当前日期 year年后(前)第一天的日期(year可以为负数)
     *
     * @param date
     * @param year
     * @return
     */
    public String getNextYearFirst(String date, int year) {
         String str = "";
         SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
         Date dat = null;
         try {
              dat = sdf.parse(date);
         } catch (Exception e) {


         }
         Calendar c = Calendar.getInstance();
         c.setTime(dat);
         c.add(Calendar.YEAR, year);
         c.set(Calendar.DAY_OF_YEAR, year);
         str = sdf.format(c.getTime());
         return str;
    }
    /**
     * 给定一个日期返回当年的第一天
     * @param date
     * @return
     */
    public String getCurrentYearFirst(String date) {
         SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
         Date dat = null;
         try {
              dat = sdf.parse(date);
         } catch (Exception e) {


         }
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
         String years = dateFormat.format(dat);
         return years+"-01-01";
    }
    /**
     * 给定一个日期返回当年的最后一天
     * @param date
     * @return
     */
    public String getCurrentYearEnd(String date){
         SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
         Date dat = null;
         try {
              dat = sdf.parse(date);
         } catch (Exception e) {


         }
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
         String years = dateFormat.format(dat);
         return years+"-12-31";
    }




    /**
     * 给定一个日期返回n天后/前的日期
     * @param date
     * @return
     */
    public String getCurrentWeekday(String date,int day) {
         JDateTime jDateTime = new JDateTime(date);
         jDateTime.addDay(day);
         return jDateTime.toString("YYYY-MM-DD");
    }


    /**
     * 给定一个日期返回当前月的第一天
     * @param date
     * @return
     */
    public String getFirstDayOfMonth(String date){
         String str = "";
         SimpleDateFormat sdf=new SimpleDateFormat(dateFormat);
         Date dat = null;
         try {
              dat = sdf.parse(date);
         } catch (Exception e) {


         }
         Calendar lastDate = Calendar.getInstance();
         lastDate.setTime(dat);
         lastDate.set(Calendar.DATE,1);//设为当前月的1 号
         str=sdf.format(lastDate.getTime());
         return str;
    }
    /**
     * 给定一个日期返回month个月的最后一天
     * @param date
     * @return
     */
    public String getDefaultDay(String date,int month){
         String str = "";
         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
         Date dat = null;
         try {
              dat = sdf.parse(date);
         } catch (Exception e) {


         }
         Calendar lastDate = Calendar.getInstance();
         lastDate.setTime(dat);
         lastDate.set(Calendar.DATE,1);//设为当前月的1 号
         lastDate.add(Calendar.MONTH,month);//加一个月,变为下月的1 号
         lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天
         str=sdf.format(lastDate.getTime());
         return str;
    }
    /**
     * 给定当前日期 week个周后第一天的日期
     *
     * @param date
     * @param week
     * @return
     */


    public String lastMonday(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
            calendar.add(Calendar.DAY_OF_WEEK, -1);
        }
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        int offset = 1 - dayOfWeek;
        calendar.add(Calendar.DATE, offset - 7);
        return fromDate(getFirstDayOfWeek(calendar.getTime(), 2),dateFormat);
    }
    /**
     * 得到某一天的该星期的第一日 00:00:00
     * 
     * @param date
     * @param firstDayOfWeek
     *            一个星期的第一天为星期几
     * 
     * @return
     */
     private Date getFirstDayOfWeek(Date date, int firstDayOfWeek) {
     Calendar cal = Calendar.getInstance();
     cal.setTime(date);
     cal.setFirstDayOfWeek(firstDayOfWeek);//设置一星期的第一天是哪一天
     cal.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);//指示一个星期中的某天
     cal.set(Calendar.HOUR_OF_DAY, 0);//指示一天中的小时。HOUR_OF_DAY 用于 24 小时制时钟。例如,在 10:04:15.250 PM 这一时刻,HOUR_OF_DAY 为 22。
     cal.set(Calendar.MINUTE, 0);//指示一小时中的分钟。例如,在 10:04:15.250 PM 这一时刻,MINUTE 为 4。
     cal.set(Calendar.SECOND, 0);
     cal.set(Calendar.MILLISECOND, 0);
     return cal.getTime();
    }
    /**
     * 给定一个时间返回当天的23:59:59
     * @return
     */
    public String getTodayLastTime(Date date){
    SimpleDateFormat simpleFormat = new SimpleDateFormat(dateFormat);
    String format = simpleFormat.format(date);
    return String.format("%s 23:59:59", format);
    }
    /**
     * 给定一个日期返回昨天00:00:00_23:59:59
     * @param date
     * @return
     */
    public String getYesterdayELTime(String datestr){
    String yesterdayDate = getCurrentWeekday(datestr, -1);
    SimpleDateFormat simpleFormat = new SimpleDateFormat(dateFormat);
    Date date=null;
try {
date = simpleFormat.parse(yesterdayDate);
} catch (ParseException e) {
e.printStackTrace();
}
Date earlyMorning = truncate(date);
String fromDate = fromDate(earlyMorning);
String todayLastTime = getTodayLastTime(earlyMorning);
return String.format("%s_%s", fromDate,todayLastTime);
    }
   /**
    * 给定一个日期获取当前日期的上一个月的  第一天日期_最后一天日期
    * @param date
    * @return firstDate_lastDate
    */
   public String getMonthFLDate(Date date){
    SimpleDateFormat format = new SimpleDateFormat(dateFormat); 
    Calendar cal_1=Calendar.getInstance();
    cal_1.setTime(date);
    cal_1.add(Calendar.MONTH, -1);
    cal_1.set(Calendar.DAY_OF_MONTH,1);
    String fristDate = format.format(cal_1.getTime());
    //获取前月的最后一天
    Calendar cale = Calendar.getInstance();
    //设置为1号,当前日期既为本月第一天 
    cale.set(Calendar.DAY_OF_MONTH,0);
    String lastDate = format.format(cale.getTime());
    return String.format("%s_%s", fristDate,lastDate);
   }
   
   /**
    * 给定一个日期获取当前日期的interval(正/负)个月的  第一天日期_最后一天日期
    * @param date
    * @param interval :  从0开始向前或向后几个月
    * @param intervalAddOne :intervalAddOne=interval+1
    * @return firstDate_lastDate
    */
   public String getMonthFLDate(Date date,int interval,int intervalAddOne){
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
    Calendar cal_1=Calendar.getInstance();
    cal_1.setTime(date);
    cal_1.add(Calendar.MONTH, interval);
    cal_1.set(Calendar.DAY_OF_MONTH,1);
    String fristDate = format.format(cal_1.getTime());
    //获取前月的最后一天
    Calendar cale = Calendar.getInstance();
    //设置为1号,当前日期既为本月第一天 
    cale.setTime(date);
    cale.add(Calendar.MONTH, intervalAddOne);
    cale.set(Calendar.DAY_OF_MONTH,cale.getActualMaximum(Calendar.DAY_OF_MONTH));
    String lastDate = format.format(cale.getTime());
    return String.format("%s_%s", fristDate,lastDate);
  }
   
   
   
   /**
    * 给定一个日期获取这个月的  第一天日期
    * @param date
    * @return firstDate_lastDate
    */
   public String getMonthFDate(Date date){
        SimpleDateFormat format = new SimpleDateFormat(dateFormat); 
        Calendar cal_1=Calendar.getInstance();
        cal_1.setTime(date);
        cal_1.set(Calendar.DAY_OF_MONTH,1);
        String fristDate = format.format(cal_1.getTime());
        return fristDate;
   }
   
   
   /**
    * 给定一个日期获取这个月的  最后一天日期
    * @param date
    * @return firstDate_lastDate
    */
   public String getMonthLDate(Date date){
        SimpleDateFormat format = new SimpleDateFormat(dateFormat); 
        //获取前月的最后一天
        Calendar cale = Calendar.getInstance();
        cale.setTime(date);
        cale.add(Calendar.MONTH, 1);
        //设置为1号,当前日期既为本月第一天 
        cale.set(Calendar.DAY_OF_MONTH,0);
        String lastDate = format.format(cale.getTime());
        return lastDate;
   }
   /**
    * 给定一段时间返回所有时间(天)
    */
   public List<String> getDayBetweenDate(Date beginDate, Date endDate) {
if(beginDate.getTime() == endDate.getTime()){
List<String> date = new ArrayList<String>();
date.add(fromDate(beginDate, "yyyy-MM-dd"));
return date;
}
    List<String> lDate = new ArrayList<String>();
    lDate.add(fromDate(beginDate, "yyyy-MM-dd"));//把开始时间加入集合
    Calendar cal = Calendar.getInstance();
    //使用给定的 Date 设置此 Calendar 的时间
    cal.setTime(beginDate);
    boolean bContinue = true;
    while (bContinue) {
        //根据日历的规则,为给定的日历字段添加或减去指定的时间量
        cal.add(Calendar.DAY_OF_MONTH, 1);
        // 测试此日期是否在指定日期之后
        if (endDate.after(cal.getTime())) {
            lDate.add(fromDate(cal.getTime(),"yyyy-MM-dd"));
        } else {
            break;
        }
    }
    lDate.add(fromDate(endDate, "yyyy-MM-dd"));//把结束时间加入集合
    return lDate;
}
   /**
    * 给定一段时间,返回所有的时间(月)
    * @param beginDate
    * @param endDate
    * @return
    */
   public List<String> getMonthBetweenDate(Date beginDate, Date endDate) {
   if(beginDate.getTime() == endDate.getTime()){
   List<String> date = new ArrayList<String>();
   date.add(fromDate(beginDate, "yyyy-MM"));
   return date;
   }
   List<String> lDate = new ArrayList<String>();
   lDate.add(fromDate(beginDate, "yyyy-MM"));//把开始时间加入集合
   Calendar cal = Calendar.getInstance();
   //使用给定的 Date 设置此 Calendar 的时间
   cal.setTime(beginDate);
   boolean bContinue = true;
   while (bContinue) {
   //根据日历的规则,为给定的日历字段添加或减去指定的时间量
   cal.add(Calendar.MONTH, 1);
   // 测试此日期是否在指定日期之后
   if (endDate.after(cal.getTime())) {
   lDate.add(fromDate(cal.getTime(),"yyyy-MM"));
   } else {
   break;
   }
   }
   lDate.add(fromDate(endDate, "yyyy-MM"));//把结束时间加入集合
   return lDate;
   }
   /**
    * 给定一段时间,返回所有的时间(年)
    * @param beginDate
    * @param endDate
    * @return
    */
   public List<String> getYearBetweenDate(Date beginDate, Date endDate) {
   if(beginDate.getTime() == endDate.getTime()){
   List<String> date = new ArrayList<String>();
   date.add(fromDate(beginDate, "yyyy"));
   return date;
   }
   List<String> lDate = new ArrayList<String>();
   lDate.add(fromDate(beginDate, "yyyy"));//把开始时间加入集合
   Calendar cal = Calendar.getInstance();
   //使用给定的 Date 设置此 Calendar 的时间
   cal.setTime(beginDate);
   boolean bContinue = true;
   while (bContinue) {
   //根据日历的规则,为给定的日历字段添加或减去指定的时间量
   cal.add(Calendar.YEAR, 1);
   // 测试此日期是否在指定日期之后
   if (endDate.after(cal.getTime())) {
   lDate.add(fromDate(cal.getTime(),"yyyy"));
   } else {
   break;
   }
   }
   lDate.add(fromDate(endDate, "yyyy"));//把结束时间加入集合
   return lDate;
   }
   
   /**
    * 通过给定一个日期返回当前月的所有天
    * @param year
    * @param month
    * @param day 如果为几就是从当月几号到月底
    * @return
    */
   public List<String> getMonthFullDay(String date){
   String[] split = date.split("-");
   int year = Integer.parseInt(split[0]);
   int month = Integer.parseInt(split[1]);
   int day = 1;
       List<String> fullDayList = new ArrayList<String>();
       if(day <= 0 ) day = 1;
       Calendar cal = Calendar.getInstance();// 获得当前日期对象
       cal.clear();// 清除信息
       cal.set(Calendar.YEAR, year);
       cal.set(Calendar.MONTH, month - 1);// 1月从0开始
       cal.set(Calendar.DAY_OF_MONTH, day);// 设置为1号,当前日期既为本月第一天
       int count = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
       for (int j = 0; j <= (count-1);) {
           if(sdf.format(cal.getTime()).equals(getLastDay(year, month)))
               break;
           cal.add(Calendar.DAY_OF_MONTH, j == 0 ? +0 : +1);
           j++;
           fullDayList.add(sdf.format(cal.getTime()));
       }
       return fullDayList;
   }
   public static String getLastDay(int year,int month){
       Calendar cal = Calendar.getInstance();
       cal.set(Calendar.YEAR, year);
       cal.set(Calendar.MONTH, month);
       cal.set(Calendar.DAY_OF_MONTH, 0);
       return sdf.format(cal.getTime());
   }
   
   /**
    * 返回一年中的12个月
    */
   public List<String> getAllMonths(){
   List<String> list = new ArrayList<String>();
   for (int i=1;i<13;i++){
   String str ="";
   if (i<10){
   str ="0"+i;
   }else{
   str =i+"";
   }
   list.add(str);
   }
   return list;
   }
   
   /**
    * 给定年份,返回这一年12个月字符串的集合
    * @param date:yyyy
    * @return yyyy-MM
    */
   public List<String> getYearMonths(Date date){
   String time = fromDate(date,"yyyy");
   List<String> list = new ArrayList<String>();
   for (int i=1;i<13;i++){
   String str ="";
   if (i<10){
   str ="0"+i;
   }else{
   str =i+"";
   }
   str = time+"-"+str;
   list.add(str);
   }
   return list;
   }
   
   /**
    * 获取当月的 天数
    */
   public int getCurrentMonthDay() {
       Calendar a = Calendar.getInstance();
       a.set(Calendar.DATE, 1);
       a.roll(Calendar.DATE, -1);
       int maxDate = a.get(Calendar.DATE);
       return maxDate;
   }


   /**
    * 根据年 月 获取对应的月份 天数
    */
   public int getDaysByYearMonth(int year, int month) {


       Calendar a = Calendar.getInstance();
       a.set(Calendar.YEAR, year);
       a.set(Calendar.MONTH, month - 1);
       a.set(Calendar.DATE, 1);
       a.roll(Calendar.DATE, -1);
       int maxDate = a.get(Calendar.DATE);
       return maxDate;
   }
   
   /**
    * 获取n年前/后的第一天的日期
    * @param date
    * @param num n年前num应传(例如:-1) n年后num应传(例如:1)
    * @return
    */
   public Date getFirstDay(Date date,int num){
   if(date!=null){
   Integer year = Integer.valueOf(fromDate(date, "yyyy"));
   Calendar cal = Calendar.getInstance();
   cal.setTime(date);
   cal.set(Calendar.YEAR, year+num);
   Date time = cal.getTime();
   String fromDate = fromDate(time, "yyyy");
   StringBuffer sbf = new StringBuffer();
   sbf.append(fromDate);
   sbf.append("-01-01 00:00:00");
   return toDate(sbf.toString());
   }
   return null;
   }
   /**
    * 给定一个日期获取当前日期当前月的  第一天日期_最后一天日期
    * @param date
    * @return firstDate_lastDate
    */
   public String getMonthFLTime(Date date){
   SimpleDateFormat format = new SimpleDateFormat(dateFormat);
   Calendar cal = Calendar.getInstance();  
   cal.setTime(date);  
   int frist = cal.getActualMinimum(Calendar.DAY_OF_MONTH);  
   cal.set(Calendar.DAY_OF_MONTH, frist);  
   String fristDate =format.format(cal.getTime());  
   Calendar cal_1 = Calendar.getInstance();  
   cal_1.setTime(date);
   int last = cal_1.getActualMaximum(Calendar.DAY_OF_MONTH);  
   cal_1.set(Calendar.DAY_OF_MONTH, last);  
   String lastDate = format.format(cal_1.getTime());  
   return  String.format("%s_%s", fristDate,lastDate);
   }
   
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值