DatesUtil日期时间工具类

package cn.com.prac.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期时间工具(可以用joda.jar,比Date强大得多)
 * 
 * @author LinFeng    
 */
public class DatesUtil {
    
    private static final Logger logger = LoggerFactory.getLogger(DatesUtil.class);
    private static final String COLON = ":";
    public static final String WEEK_NAMES[] = { "周日", "周一", "周二", "周三", "周四", "周五","周六" };
    public static final String WEEK_EN_NAMES[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五","星期六" };
    public static final String CHINE_DATE_FORMAT_TO_MINUTE="yyyy-MM-dd HH:mm";
    public static final String CHINESE_DATE_FORMAT_LONG_TO_MINUTE="yyyyMMdd HH:mm";
    public static final String CHINESE_DATE_FORMAT_LONG = "yyyyMMdd";
    public static final String CHINESE_DATE_FORMAT_LINE = "yyyy-MM-dd";
    public static final String CHINESE_DATE_FORMAT_LINE_YM = "yyyy-MM";
    public static final String CHINESE_DATE_FORMAT_SPOT = "yyyy.MM.dd";
    public static final String CHINESE_DATE_FORMAT_SPOT_ALL = "yyyy.MM.dd HH:mm:ss";
    public static final String CHINESE_DATETIME_FORMAT_LINE = "yyyy-MM-dd HH:mm:ss";
    public static final String CHINESE_DATE_FORMAT_SLASH = "yyyy/MM/dd";
    public static final String CHINESE_DATETIME_FORMAT_SLASH = "yyyy/MM/dd HH:mm:ss";
    public static final String DATETIME_NOT_SEPARATOR="yyyyMMddHHmmssSSS";
    public static final String TIME_NOT_SEPARATOR="HHmmssSSS";
    public static final String MONTH_DAY="M月dd日";
    public static final String MONTH_WEEK_DAY="M月dd日 (周)";
    public static final String MONTH_DAY_WEEK_TIMES="M.dd(周) HH:mm";
    public static final String MONTH_DAY_WEEK_DATE="M月dd日(周)";
    public static final String MONTH_DAY_WEEK_EN_TIMES="yyyy.MM.dd 星期  HH:mm";
    public static final String HM_TIME_SPOT = "HH:mm";
    public static final long DAY_LONG = 60*60*24l;

    private static final String[] SUPPORT_ALL_FORMATS = new String[]{CHINESE_DATE_FORMAT_LINE,CHINESE_DATE_FORMAT_LONG,
            CHINESE_DATETIME_FORMAT_LINE, CHINESE_DATE_FORMAT_SLASH, CHINESE_DATETIME_FORMAT_SLASH};

    private static final String DEFAULT_DATE_FORMAT = CHINESE_DATETIME_FORMAT_LINE;
    private static final SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);

    /**
     * 日期格式化
     * @param date 日期
     * @param pattern 例:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public synchronized static String format(Date date, String pattern) {
        sdf.applyPattern(pattern);
        return sdf.format(date);
    }

    /**
     * 将日期转换成yyyy-MM-dd HH:mm:ss的形式
     * @param date 要转换的日期
     * @return
     */
    public static String format(Date date) {
        return format(date, DEFAULT_DATE_FORMAT);
    }

    /**
     * 将当前时间转换成需要的形式,如:yyyy-MM-dd HH:mm:ss,yyyy-MM-dd
     * @param pattern
     * @return
     */
    public static String format(String pattern) {
        return format(new Date(), pattern);
    }
    
    /**
     * 将时间字符串,转换成pattern格式的时间
     * @param dateString 时间字符串
     * @param pattern 
     * @return
     */
    public synchronized static Date parse(String dateString, String pattern) {
        sdf.applyPattern(pattern);
        try {
            return sdf.parse(dateString);
        } catch (Exception e) {
            throw new RuntimeException("parse String[" + dateString + "] to Date faulure with pattern[" + pattern
                    + "].");
        }
    }

    public synchronized static Date parse(String dateString, String[] patterns) {
        for (String pattern : patterns) {
            if (StringUtils.isBlank(pattern)) {
                continue;
            }
            sdf.applyPattern(pattern);
            try {
                return sdf.parse(dateString);
            } catch (Exception e) {
                // ignore exception
                continue;
            }
        }
        throw new UnsupportedOperationException("Parse String[" + dateString + "] to Date faulure with patterns["
                + Arrays.toString(patterns) + "]");

    }
    
    /**
     * 将时间字符串转为时间
     * @param dateString
     * @return
     */
    public static Date parse(String dateString) {
        return parse(dateString, SUPPORT_ALL_FORMATS);
    }
    
    /**
     * 获取某个时间多少毫秒后的时间
     * @param date 时间
     * @param millisecond 毫秒
     * @return
     */
    public static Date addDate(Date date, long millisecond) {
        return new Date(date.getTime() + millisecond);
    }
    
    /**
     * 获取某一天的明天的当前时间
     * @param date 
     * @return
     */
    public static Date addDay(Date date) {
        long oneDayMillisecond = 24 * 60 * 60 * 1000l;
        return addDate(date, oneDayMillisecond);
    }
    
    /**
     * 获取某一天的昨天的当前时间
     * @param date 日期
     * @return
     */
    public static Date minusDay(Date date) {
        long oneDayMillisecond = 24 * 60 * 60 * 1000l;
        return addDate(date, -oneDayMillisecond);
    }

    /**
     * 获取当前时间的时间戳
     * @return
     */
    public static Long getCurrentLongDate() {
        return new Date().getTime();
    }
    
    /**
     * 获取某个时间相隔多少天前或者后的的时间
     * @param date 时间
     * @param day 相隔的天上,之前为负,之后为正,例:dateAddDay(new Date(),-35)
     * @return
     */
    public static String dateAddDay(Date date,int day) {
            Calendar cl = Calendar.getInstance();
            cl.setTime(date);
            cl.add(Calendar.DATE,day);
            cl.getTime();
            SimpleDateFormat sdf = new SimpleDateFormat(CHINESE_DATETIME_FORMAT_LINE);
            return sdf.format(cl.getTime());
    }
    
    
    /**
     * 将时间戳,转换为Date
     * @param date
     * @return
     */
    public static Date parseLong2Date(Long date) {
        return new Date(date*1000);
    }
    
    
    /**
     * 获取当前天 的long值  即:2015-01-01 00:00:00的 long值
     * @return
     */
    public static  Long getCurrentLongDay(){
        Calendar  calendar  = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        return calendar.getTimeInMillis()/1000;
    }
    
    
    /**
     * 获取当前天 的long值  即:2016-01-01 00:00:00的 long值/2016-01-01 hour_of_day:minute:second
     * @param hour_of_day 小时
     * @param minute  分钟
     * @param second  秒钟
     * @return
     */
    public static  Long getCurrentLongDay(int hour_of_day,int minute,int second){
        Calendar  calendar  = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY,hour_of_day);
        calendar.set(Calendar.MINUTE,minute);
        calendar.set(Calendar.SECOND,second);
        return calendar.getTimeInMillis()/1000;
    }
    
    /**
     * 获取当前天 的long值  即:2015-01-01 23:59:59的 long值
     * @return
     */
    public static  Long getLastLongDay(){
        Calendar  calendar  = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY,23);
        calendar.set(Calendar.MINUTE,59);
        calendar.set(Calendar.SECOND,59);
        return calendar.getTimeInMillis();
    }
    
    /**
     * 获取下前天 的long值  即:2015-01-01 00:00:00的 long值
     * @return
     */
    public static  Long getNextLongDay(){
        Calendar  calendar  = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,1);
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        return calendar.getTimeInMillis();
    }
    
    /**
     * 获取 传入的日期的 0:0:0对应的long值
     * @return
     */
    public static  Long getDateZeroLong(Long date){
        Calendar  calendar  = Calendar.getInstance();
        calendar.setTime(parseLong2Date(date));
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        return calendar.getTimeInMillis();
    }
    
    /**
     * 取当前月的第一天,按pattern显示
     * @param pattern
     * @return
     */
    public static String getnowMonthFristDay(String pattern){
           Calendar c = Calendar.getInstance();    
           c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
           return DatesUtil.format(c.getTime(), pattern);
    }
    
    
    /**
     * 取某个月之前或之后的第几天,并以pattern显示
     * @param month 月
     * @param day 天
     * @param pattern 
     * @return
     */
    public static String getnextThreeMonthtoday(int month,int day,String pattern){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH,month);
        calendar.set(Calendar.DAY_OF_MONTH,day);//设置为1号,当前日期既为本月第一天 
        Date threeMonth =calendar.getTime();
        return DatesUtil.format(threeMonth, pattern);
    }
    
    /**
     * 获取昨天凌晨的long值
     * @return
     */
    public static Long getYestodayZeroLong(){
        Calendar  calendar  = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,-1);
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,1);
        return calendar.getTimeInMillis();
    }
    
    
    /**
     * 根据天数获取几天前的最早时间
     * @param daynum 天数 
     * @return
     * @date 2015年2月9日
     */
    public static Long getDatebyDaynum(int daynum){
        Calendar  calendar  = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,daynum);
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        return calendar.getTimeInMillis();
    }
    
    /**
     * 获取当前天时间 23:59:59的 long值
     * @return
     */
    public static  Long getLastLongDayNum(int daynum){
        Calendar  calendar  = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,daynum);
        calendar.set(Calendar.HOUR_OF_DAY,23);
        calendar.set(Calendar.MINUTE,59);
        calendar.set(Calendar.SECOND,59);
        return calendar.getTimeInMillis();
    }
    
    /**
     * 获取前两天的时间long值  如:20150114
     * @return
     */
    public static Long getBeforeTwoDaysLong(){
        Calendar  calendar  = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH,-2);
        String daysLong = format(calendar.getTime(), CHINESE_DATE_FORMAT_LONG);
        return NumberUtils.toLong(daysLong);
    }
    
    /**
     * 两个时间相差天数
     * @param date1 时间1
     * @param date2 时间2
     * @return
     */
    public static int daysBetween(Date date1,Date date2){  
        Calendar cal = Calendar.getInstance();  
        cal.setTime(date1);  
        long time1 = cal.getTimeInMillis();               
        cal.setTime(date2);  
        long time2 = cal.getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);  
        return Integer.parseInt(String.valueOf(between_days));        
    } 
    
    /**
     * 相差天数,不足一天按一天算
     * @param date1 时间1
     * @param date2 时间2
     * @return
     */
    public static int daysBetween2(Date date1,Date date2){
        Calendar cal = Calendar.getInstance();  
        cal.setTime(date1);  
        long time1 = cal.getTimeInMillis();               
        cal.setTime(date2);  
        long time2 = cal.getTimeInMillis();       
        long between_days=(time2-time1)/(1000*3600*24);  
        between_days = (time2-time1)%(1000*3600*24) > 0 ? between_days + 1 : between_days;
        return Integer.parseInt(String.valueOf(between_days)); 
    }
    
    /**
     * 获取指定天的long值
     * @param dateStr 时间
     * @param pattern 格式
     * @param subtractDate  减的天数
     * @return
     */
    public static long getAssignDateLong(String dateStr, String pattern,long subtractDate){
        SimpleDateFormat df = new SimpleDateFormat(pattern);
        long dateLong = 0;
        try {
            dateLong = (df.parse(dateStr).getTime()-subtractDate*1000)/1000;
        } catch (ParseException e) {
            logger.error("日期格式化错误:" + e.getMessage());
        }
        return dateLong;
    }
    
    
    /**
     * 验证是否日期
     * @param str
     * @param pattern
     * @return
     */
    public static boolean isValidDate(String str,String pattern) {
          // 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
          SimpleDateFormat format = new SimpleDateFormat(pattern);
            try {
                //设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
               format.setLenient(false);
               format.parse(str);
            } catch (ParseException e) {
               // e.printStackTrace();
               // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
               return false;
            } 
          return true;
     }
    
    
    /**
     * 获取包含星期几的 日期格式
     * @param date
     * @param pattern
     * @return MM.dd 周- HH:mm
     * pattern格式 中必须包含【周】处理时进行替换
     */
    public static String getContainsWeekStr(Long date,String pattern){
        Date  dateTime = new Date(date);;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateTime);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
        String resultDate = DatesUtil.format(dateTime, pattern);
        return resultDate.replace("周",WEEK_NAMES[dayOfWeek]);
    }
    
    /**
     * 获取包含星期几的 日期格式
     * @param date
     * @param pattern
     * @return MM.dd 星期- HH:mm
     * pattern格式 中必须包含【星期】处理时进行替换
     */
    public static String getContainsEnWeekStr(Long date,String pattern){
        Date  dateTime = new Date(date);;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateTime);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
        String resultDate = DatesUtil.format(dateTime, pattern);
        return resultDate.replace("星期",WEEK_EN_NAMES[dayOfWeek]);
    }
    
    /**
     * 时间相加
     * @param date 时间
     * @param day 天数
     * @return
     */
    public static Date addDay(Date date,int day) {
            Calendar cl = Calendar.getInstance();
            cl.setTime(date);
            cl.add(Calendar.DATE,day);
            return cl.getTime();
    }
    
    
    /**
     * 获取某日期【第一天日期】 的long值  即:2016-07-01 00:00:00的 long值/dataStr hour_of_day:minute:second
     * @param dataStr 日期  如:2016-07-20
     * @param hour_of_day 小时
     * @param minute  分钟
     * @param second  秒钟
     * @return
     */
    public static  Long getFirstLongDay(String dataStr,String pattern,int hour_of_day,int minute,int second){
        GregorianCalendar gc=new GregorianCalendar();
        gc.setTime(DatesUtil.parse(dataStr,pattern));
        
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR,gc.get(GregorianCalendar.YEAR));
        cal.set(Calendar.MONTH, gc.get(GregorianCalendar.MONTH)+1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.add(Calendar.DAY_OF_MONTH, -1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        
        cal.set(Calendar.HOUR_OF_DAY,hour_of_day);
        cal.set(Calendar.MINUTE,minute);
        cal.set(Calendar.SECOND,second);
        
        return cal.getTimeInMillis();
    }
    
    /**
     * 获取某日期【最后一天日期】 的long值  即:2016-07-31 00:00:00的 long值/dataStr hour_of_day:minute:second
     * @param dataStr 日期  如:2016-07-20
     * @param hour_of_day 小时
     * @param minute  分钟
     * @param second  秒钟
     * @return
     */
    public static  Long getLastLongDay(String dataStr,String pattern,int hour_of_day,int minute,int second){
        GregorianCalendar gc=new GregorianCalendar();
        gc.setTime(DatesUtil.parse(dataStr,pattern));
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR,gc.get(GregorianCalendar.YEAR));
        cal.set(Calendar.MONTH, gc.get(GregorianCalendar.MONTH)+1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.add(Calendar.DAY_OF_MONTH, -1);
        cal.set(Calendar.HOUR_OF_DAY,hour_of_day);
        cal.set(Calendar.MINUTE,minute);
        cal.set(Calendar.SECOND,second);
        return cal.getTimeInMillis()/1000;
        
    }
    
    
    /** 
     * 判断是否是周末 
     * @return true:是,false:不是
     */  
    public static boolean isWeekend(Date  date){  
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int week=cal.get(Calendar.DAY_OF_WEEK)-1;  
        if(week ==6 || week==0){//0代表周日,6代表周六  
            return true;  
        }  
        return false;  
    }  
    
    /**
     * 获得本周一0点时间 
     * @return
     */
    public static Long getWeekMorningLong() {  
        Calendar cal = Calendar.getInstance();  
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);  
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  
        return  cal.getTime().getTime()/1000;  
    }  
  
    /**
     * 获得下周一0点时间 
     * @return
     */
    public  static Long getWeekNightLong() {  
        Calendar cal = Calendar.getInstance();  
        cal.setTime(new Date(getWeekMorningLong()*1000));  
        cal.add(Calendar.DAY_OF_WEEK, 7);  
        return cal.getTime().getTime();  
    }  
    
    
    /**
     * 校验时间格式 HH:mm
     * @param time
     * @return
     */
    public static boolean validateTime(String time){
        time = StringUtils.trim(time);
        if (StringUtils.isBlank(time)){
            return false;
        }
        
        if (StringUtils.length(time) !=5 ){
            return false;
        }
        
        if (!StringUtils.contains(time,COLON)){
            return false;
        }
        
        String[] times = time.split(COLON);
        if (times.length != 2){
            return false;
        }
        
        String hours = times[NumberUtils.INTEGER_ZERO];
        String minites = times[NumberUtils.INTEGER_ONE];
        if (hours.length()!=2 || minites.length() !=2 
                ||  !NumberUtils.isDigits(hours) 
                || !NumberUtils.isDigits(minites)){
            return false;
        }
        
        int hour  = NumberUtils.toInt(hours);
        if (hour < 0 || hour > 23){
            return false;
        }
        
        int minite = NumberUtils.toInt(minites);
        if (minite < 0 || minite > 59 ){
            return false;
        }
        
        return true;
    }
    
    /**
     * 获取传入时间开始的long值  即:2015-01-01 00:00:00的 long值
     * @return
     */
    public static  Long getStartLongDayByCalendar(Calendar calendar){
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        return calendar.getTimeInMillis()/1000*1000;
    }
    
    /**
     * 获取传入时间结束的long值  即:2015-01-01 23:59:59的 long值
     * @return
     */
    public static  Long getLastLongDayByCalendar(Calendar calendar){
        calendar.set(Calendar.HOUR_OF_DAY,23);
        calendar.set(Calendar.MINUTE,59);
        calendar.set(Calendar.SECOND,59);
        return calendar.getTimeInMillis()/1000*1000;
    }
    
    /**
     * 获取前昨天的时间long值  如:20150114
     * @return
     */
    public static Calendar getBeforeOneDaysLong(){
        Calendar  calendar  = Calendar.getInstance();
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MINUTE,0);
        return calendar;
    }
    
    /**
     * 获取上周一时间
     */
    public static Calendar lastMonday() {
        Calendar calendar = Calendar.getInstance();
        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);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MINUTE,0);
        return calendar;
    }
    
    /**
     * 获取上周五时间
     */
    public static Calendar lastFirday() {
        Calendar calendar = Calendar.getInstance();
        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 = 7 - dayOfWeek;
        calendar.add(Calendar.DATE, offset - 7);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MINUTE,0);
        return calendar;
    }
    
}
原文地址:https://www.cnblogs.com/-scl/p/7845136.html