時間處理工具類&工作日處理類

jia635發表於2014-09-14

時間處理類:

public class DateUtil {
    /**日誌記錄*/
    private final static Logger LOGGER                  = LoggerFactory.getLogger(DateUtil.class);
    /**一天的秒數*/
    public final static long    ONE_DAY_SECONDS         = 86400;
    /**一天的毫秒數*/
    public final static long    ONE_DAY_MILL_SECONDS    = 86400000;
    /**yyyyMMdd時間格式*/
    public final static String  SHORT_FORMAT            = "yyyyMMdd";
    /**yyyyMMddHHmmss時間格式*/
    public final static String  LONG_FORMAT             = "yyyyMMddHHmmss";
    /** 比long少秒的日期格式 yyyyMMddHHmm */
    public final static String  LOWER_LONG_FORMAT       = "yyyyMMddHHmm";
    /**yyyy-MM-dd時間格式*/
    public final static String  WEB_FORMAT              = "yyyy-MM-dd";
    /**HHmmss時間格式*/
    public final static String  TIME_FORMAT             = "HHmmss";
    /**yyyyMM時間格式*/
    public final static String  MONTH_FORMAT            = "yyyyMM";
    /**yyyy年MM月dd日時間格式*/
    public final static String  CHINESE_DT_FORMAT       = "yyyy年MM月dd日";
    /**yyyy-MM-dd HH:mm:ss時間格式*/
    public final static String  NEW_FORMAT              = "yyyy-MM-dd HH:mm:ss";
    /**yyyy-MM-dd HH:mm時間格式*/
    public final static String  NO_SECOND_FORMAT        = "yyyy-MM-dd HH:mm";
    /**yyyy時間格式*/
    public static String        YEAR_FORMAT             = "yyyy";
    /**yyyy年MM月dd日HH點mm分ss秒*/
    public final static String  CHINESE_ALL_DATE_FORMAT = "yyyy年MM月dd日HH點mm分ss秒";
    /**HH:mm時間格式*/
    public final static String  HOURS_FORMAT            = "HH:mm";
    /**HH:mm時間格式*/
    public final static String  SECOND_FORMAT           = "HH:mm:ss";
    /**yyyy.MM.dd 時間格式*/
    public final static String  DATE_PICKER_FORMAT      = "yyyy.MM.dd";
    /** 零時零分零秒 */
    public static final String  START_TIME              = " 00:00:00";
    /** 23:59:59 */
    public static final String  END_TIME                = " 23:59:59";

    /**
     * 得到新的時間格式
     * @param pattern   匹配表示式
     * @return          新的時間格式
     */
    public static DateFormat getNewDateFormat(String pattern) {
        DateFormat df = new SimpleDateFormat(pattern);

        df.setLenient(false);
        return df;
    }

    /**
     * 時間格式
     * @param date      格式化前的時間
     * @param format    需要轉換的格式
     * @return          格式化後的時間
     */
    public static String format(Date date, String format) {
        if (date == null) {
            return null;
        }

        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 時間格式
     * @param date      格式化前的時間
     * @param format    需要轉換的格式
     * @return          格式化後的時間
     * @throws ParseException 
     */
    public static Date formatToDate(String dateStr, String format) throws ParseException {
        if (dateStr == null) {
            return null;
        }
        DateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.parse(dateStr);
    }

    /**
     * 取得當前年份
     * @return
     */
    public static String getYearString() {
        DateFormat dateFormat = getNewDateFormat(YEAR_FORMAT);

        return getDateString(new Date(), dateFormat);
    }

    /**
     * 格式化日期,去除時間
     * @param sDate   格式化前的日期
     * @return        格式化後的日期
     * @throws ParseException   時間格式化異常
     */
    public static Date parseDateNoTime(String sDate) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat(SHORT_FORMAT);

        if ((sDate == null) || (sDate.length() < SHORT_FORMAT.length())) {
            throw new ParseException("length too little", 0);
        }

        if (!StringUtil.isNumeric(sDate)) {
            throw new ParseException("not all digit", 0);
        }

        return dateFormat.parse(sDate);
    }

    /**
     * 格式化日期,去除時間
     * @param sDate     格式化前的日期
     * @param format    需要轉換的格式
     * @return          格式化後的日期
     * @throws ParseException 時間格式化異常
     */
    public static Date parseDateNoTime(String sDate, String format) throws ParseException {
        if (StringUtil.isBlank(format)) {
            throw new ParseException("Null format. ", 0);
        }

        DateFormat dateFormat = new SimpleDateFormat(format);

        if ((sDate == null) || (sDate.length() < format.length())) {
            throw new ParseException("length too little", 0);
        }

        return dateFormat.parse(sDate);
    }

    /**
     * 格式化日期,去除時間
     * @param sDate     格式化前的日期
     * @param delimit   替換字元
     * @return          格式化後的日期
     * @throws ParseException 時間格式化異常
     */
    public static Date parseDateNoTimeWithDelimit(String sDate, String delimit)
                                                                               throws ParseException {
        sDate = sDate.replaceAll(delimit, "");

        DateFormat dateFormat = new SimpleDateFormat(SHORT_FORMAT);

        if ((sDate == null) || (sDate.length() != SHORT_FORMAT.length())) {
            throw new ParseException("length not match", 0);
        }

        return dateFormat.parse(sDate);
    }

    /**
     * 將時間轉換成yyyyMMddHHmmss格式
     * @param sDate 格式化前的日期
     * @return      格式化後的日期
     */
    public static Date parseDateLongFormat(String sDate) {
        DateFormat dateFormat = new SimpleDateFormat(LONG_FORMAT);
        Date d = null;

        if ((sDate != null) && (sDate.length() == LONG_FORMAT.length())) {
            try {
                d = dateFormat.parse(sDate);
            } catch (ParseException ex) {
                return null;
            }
        }

        return d;
    }

    /**
     * 將時間yyyy-MM-dd HH:mm:ss轉換成Date格式
     * @param sDate 格式化前的日期
     * @return      格式化後的日期
     */
    public static Date parseDateNewFormat(String sDate) {
        DateFormat dateFormat = new SimpleDateFormat(NEW_FORMAT);
        Date d = null;
        if (sDate != null) {
            try {
                d = dateFormat.parse(sDate);
            } catch (ParseException ex) {
                throw new RuntimeException("將時間轉換為yyyy-MM-dd HH:mm:ss格式異常 格式轉化前字串=" + sDate, ex);
            }
        }
        return d;
    }

    /**
     * 將yyyy-MM-dd轉換成時間格式
     * @param sDate 格式化前的日期
     * @return      格式化後的日期
     */
    public static Date parseDateFormat(String sDate) {
        DateFormat dateFormat = new SimpleDateFormat(WEB_FORMAT);
        Date d = null;
        if (sDate != null) {
            try {
                d = dateFormat.parse(sDate);
            } catch (ParseException ex) {
                throw new RuntimeException("將yyyy-MM-dd轉換成時間格式, 異常 格式化前字串=" + sDate, ex);
            }
        }
        return d;
    }

    /**
     * 解析日期字串以"yyyy-MM-dd"或"yyyy-MM-dd HH:mm:ss"格式到Date
     * 
     * @param dateStr 格式化前的日期
     * @return 格式化後的日期
     */
    public static Date parseDate(String dateStr) {
        Date date = null;
        if (dateStr != null) {
            String[] parsePatterns = { WEB_FORMAT, NEW_FORMAT };
            try {
                date = DateUtils.parseDate(dateStr, parsePatterns);
            } catch (ParseException e) {
                throw new RuntimeException("日期轉化異常,格式化前字串=" + dateStr, e);
            }
        }
        return date;
    }

    /**
     * 將時間轉換為自定義格式
     * 
     * @param sDate 格式化錢的日期
     * @param format 時間格式化樣式
     * @return 格式化後的日期
     */
    public static Date parseDateFormat(String sDate, String format) {
        DateFormat dateFormat = new SimpleDateFormat(format);
        Date d = null;
        if (StringUtil.isBlank(sDate) || StringUtil.isBlank(format)
            || sDate.length() != format.length()) {
            return d;
        }
        try {
            d = dateFormat.parse(sDate);
        } catch (ParseException e) {
            throw new RuntimeException("將時間轉換為自定義格式異常 格式化前字串=" + sDate + " ,格式化樣式=" + format, e);
        }
        return d;
    }

    /**
     * 計算當前時間幾小時之前的時間
     *
     * @param date
     * @param hours
     *
     * @return
     */
    public static Date decreaseHours(Date date, long hours) {
        return decreaseMinutes(date, hours * 60);
    }

    /**
     * 計算當前時間幾分鐘之前的時間
     *
     * @param date
     * @param minutes
     *
     * @return
     */
    public static Date decreaseMinutes(Date date, long minutes) {
        return decreaseSeconds(date, minutes * 60);
    }

    /**
     * @param date1
     * @param secs
     *計算當前時間幾秒鐘之前的時間
     * @return
     */

    public static Date decreaseSeconds(Date date1, long secs) {
        return new Date(date1.getTime() - (secs * 1000));
    }

    /**
     * 計算當前時間幾小時之後的時間
     *
     * @param date  時間
     * @param hours 小時數
     *
     * @return      轉換後的時間
     */
    public static Date addHours(Date date, long hours) {
        return addMinutes(date, hours * 60);
    }

    /**
     * 計算當前時間幾分鐘之後的時間
     *
     * @param date      時間
     * @param minutes   分鐘數
     *
     * @return          轉換後的時間
     */
    public static Date addMinutes(Date date, long minutes) {
        return addSeconds(date, minutes * 60);
    }

    /**
     * 增加毫秒數
     * @param date1 日期
     * @param secs  毫秒數
     * @return      增加後的毫秒數
     */
    public static Date addSeconds(Date date1, long secs) {
        return new Date(date1.getTime() + (secs * 1000));
    }

    /**
     * 判斷輸入的字串是否為合法的小時
     *
     * @param hourStr       小時
     *
     * @return true/false   是否合法
     */
    public static boolean isValidHour(String hourStr) {
        if (!StringUtil.isEmpty(hourStr) && StringUtil.isNumeric(hourStr)) {
            int hour = new Integer(hourStr).intValue();

            if ((hour >= 0) && (hour <= 23)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 判斷輸入的字串是否為合法的分或秒
     *
     * @param str 分或秒
     *
     * @return true/false   是否合法
     */
    public static boolean isValidMinuteOrSecond(String str) {
        if (!StringUtil.isEmpty(str) && StringUtil.isNumeric(str)) {
            int hour = new Integer(str).intValue();

            if ((hour >= 0) && (hour <= 59)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 取得新的日期
     *
     * @param date1 日期
     * @param days 天數
     *
     * @return 新的日期
     */
    public static Date addDays(Date date1, long days) {
        return addSeconds(date1, days * ONE_DAY_SECONDS);
    }

    /**
     * 獲取明天的日期
     * @param sDate 今天的日期
     * @return      明天的日期
     * @throws ParseException
     */
    public static String getTomorrowDateString(String sDate) throws ParseException {
        Date aDate = parseDateNoTime(sDate);

        aDate = addSeconds(aDate, ONE_DAY_SECONDS);

        return getDateString(aDate);
    }

    /**
     * 獲得yyyyMMddHHmmss格式的時間
     * @param date  轉換前的時間
     * @return      轉換後的時間
     */
    public static String getLongDateString(Date date) {
        DateFormat dateFormat = new SimpleDateFormat(LONG_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 獲得yyyyMMddHHmm格式的時間
     * @param date  轉換前的時間
     * @return      轉換後的時間
     */
    public static String getLowwerLongDateString(Date date) {
        DateFormat dateFormat = new SimpleDateFormat(LOWER_LONG_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 獲得yyyy-MM-dd HH:mm:ss格式的時間
     * @param date  轉換前的時間
     * @return      轉換後的時間
     */
    public static String getNewFormatDateString(Date date) {
        if (date == null) {
            return "";
        }
        DateFormat dateFormat = new SimpleDateFormat(NEW_FORMAT);
        return getDateString(date, dateFormat);
    }

    /**
     * 獲得HH:mm格式的時間
     * @param date  轉換前的時間
     * @return      轉換後的時間
     */
    public static String getHoursFormatDateString(Date date) {
        DateFormat dateFormat = new SimpleDateFormat(HOURS_FORMAT);
        return getDateString(date, dateFormat);
    }

    /**
     * 獲得HH:mm:ss格式的時間
     * @param date  轉換前的時間
     * @return      轉換後的時間
     */
    public static String getSecondFormatDateString(Date date) {
        DateFormat dateFormat = new SimpleDateFormat(SECOND_FORMAT);
        return getDateString(date, dateFormat);
    }

    /**
     * 格式化時間
     * @param date          轉換前的日期
     * @param dateFormat    需要轉換的格式
     * @return              轉換後的日期
     */
    public static String getDateString(Date date, DateFormat dateFormat) {
        if (date == null || dateFormat == null) {
            return null;
        }

        return dateFormat.format(date);
    }

    /**
     * 獲得昨天的時間
     * @param sDate 今天的時間
     * @return      昨天的時間
     * @throws ParseException
     */
    public static String getYesterDayDateString(String sDate) throws ParseException {
        Date aDate = parseDateNoTime(sDate);

        aDate = addSeconds(aDate, -ONE_DAY_SECONDS);

        return getDateString(aDate);
    }

    /**
     * 當天的時間格式化為 yyyyMMdd
     * @param date 轉換前的日期
     * @return     轉換後的日期
     */
    public static String getDateString(Date date) {
        DateFormat df = getNewDateFormat(SHORT_FORMAT);

        return df.format(date);
    }

    /**
     * 獲得yyyy-MM-dd格式的時間
     * @param date 轉換前的時間
     * @return     轉換後的時間
     */
    public static String getWebDateString(Date date) {
        DateFormat dateFormat = getNewDateFormat(WEB_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 取得“X年X月X日”的日期格式
     *
     * @param date 轉換前的時間
     *
     * @return     轉換後的時間
     */
    public static String getChineseDateString(Date date) {
        DateFormat dateFormat = getNewDateFormat(CHINESE_DT_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 取得“X年X月X日x點x分x秒”的日期格式
     *
     * @param date 轉換前的時間
     *
     * @return     轉換後的時間
     */
    public static String getChineseAllDateString(Date date) {
        DateFormat dateFormat = getNewDateFormat(CHINESE_ALL_DATE_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 獲得yyyyMMdd格式的時間
     * @return 轉換後的時間
     */
    public static String getTodayString() {
        DateFormat dateFormat = getNewDateFormat(SHORT_FORMAT);

        return getDateString(new Date(), dateFormat);
    }

    /**
     * 獲得HHmmss格式的時間
     * @param date  轉換前的時間
     * @return      轉換後的時間
     */
    public static String getTimeString(Date date) {
        DateFormat dateFormat = getNewDateFormat(TIME_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 獲得幾天前的時間    
     * @param days 天數
     * @return     幾天前的時間        
     */
    public static Date getBeforeDay(int days) {
        return new Date(System.currentTimeMillis() - (ONE_DAY_MILL_SECONDS * days));
    }

    /**
     * 獲得幾天前的時間    
     * @param days 天數
     * @return     幾天前的時間        "yyyyMMdd"
     */
    public static String getBeforeDayString(int days) {
        Date date = new Date(System.currentTimeMillis() - (ONE_DAY_MILL_SECONDS * days));
        DateFormat dateFormat = getNewDateFormat(SHORT_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 獲得幾天前的時間
     * @param days 天數
     * @return     幾天前的時間                "yyyy-MM-dd"
     */
    public static String getBeforeDayStringWithWebFormat(int days) {
        Date date = new Date(System.currentTimeMillis() - (ONE_DAY_MILL_SECONDS * days));
        DateFormat dateFormat = getNewDateFormat(WEB_FORMAT);

        return getDateString(date, dateFormat);
    }

    /**
     * 根據結束時間和開始時間獲取間隔毫秒數
     *
     * @param endDate 開始時間
     * @param beginDate   結束時間
     * @return 間隔毫秒數
     */
    public static long getDiffMillis(Date endDate, Date beginDate) {
        Assert.notNull(endDate, "結束時間不能為Null.");
        Assert.notNull(beginDate, "開始時間不能為Null.");

        Calendar endCalendar = new GregorianCalendar();
        endCalendar.setTime(endDate);
        Calendar beginCalendar = new GregorianCalendar();
        beginCalendar.setTime(beginDate);
        return endCalendar.getTimeInMillis() - beginCalendar.getTimeInMillis();
    }

    /**
     * 根據結束時間和開始時間獲取間隔秒數
     *
     * @param endDate 開始時間
     * @param beginDate   結束時間
     * @return 間隔秒數
     */
    public static long getDiffSeconds(Date endDate, Date beginDate) {
        return getDiffMillis(endDate, beginDate) / 1000;
    }

    /**
     * 根據結束時間和開始時間獲取間隔分鐘數
     *
     * @param endDate 開始時間
     * @param beginDate   結束時間
     * @return 間隔分鐘數
     */
    public static long getDiffMinutes(Date endDate, Date beginDate) {
        return getDiffMillis(endDate, beginDate) / (60 * 1000);
    }

    /**
     * 根據結束時間和開始時間獲取間隔小時數
     *
     * @param endDate 開始時間
     * @param beginDate   結束時間
     * @return 間隔小時數
     */
    public static long getDiffHours(Date endDate, Date beginDate) {
        return getDiffMillis(endDate, beginDate) / (60 * 60 * 1000);
    }

    /**
     * 根據結束時間和開始時間獲取間隔天數
     *
     * @param endDate 開始時間
     * @param beginDate   結束時間
     * @return 間隔天數
     */
    public static long getDiffDays(Date endDate, Date beginDate) {
        return getDiffMillis(endDate, beginDate) / (24 * 60 * 60 * 1000);
    }

    /**
     * 獲得幾天前的時間
     * @param dateString 時間
     * @param days       天數
     * @return           轉換後的時間
     */
    public static String getBeforeDayString(String dateString, int days) {
        Date date;
        DateFormat df = getNewDateFormat(SHORT_FORMAT);

        try {
            date = df.parse(dateString);
        } catch (ParseException e) {
            date = new Date();
        }

        date = new Date(date.getTime() - (ONE_DAY_MILL_SECONDS * days));

        return df.format(date);
    }

    /**
     * 獲得幾天前的時間
     * @param dateString 時間
     * @param days       天數
     * @return           轉換後的時間 格式為""yyyy-MM-dd""
     */
    public static String getBeforeDayStringWithWebFormat(String dateString, int days) {
        Date date;
        DateFormat df = getNewDateFormat(WEB_FORMAT);

        try {
            date = df.parse(dateString);
        } catch (ParseException e) {
            date = new Date();
        }

        date = new Date(date.getTime() - (ONE_DAY_MILL_SECONDS * days));

        return df.format(date);
    }

    /**
     * 獲得幾天前的時間
     * @param dateString 時間
     * @param days       天數
     * @return           轉換後的時間 格式為"yyyy-MM-dd HH:mm:ss"
     */
    public static String getBeforeDayStringWithNewFormat(String dateString, int days) {
        Date date;
        DateFormat df = getNewDateFormat(NEW_FORMAT);

        try {
            date = df.parse(dateString);
        } catch (ParseException e) {
            date = new Date();
        }

        date = new Date(date.getTime() - (ONE_DAY_MILL_SECONDS * days));

        return df.format(date);
    }

    /**
     * 獲得幾天前的時間
     * @param dateString 時間
     * @param days       天數
     * @return           轉換後的時間 格式為""yyyy-MM-dd HH:mm:ss""
     */
    public static String getBeforeDayStringWithFormat(String dateString, int days) {
        Date date;
        DateFormat df = getNewDateFormat(NEW_FORMAT);

        try {
            date = df.parse(dateString);
        } catch (ParseException e) {
            date = new Date();
        }

        date = new Date(date.getTime() - (ONE_DAY_MILL_SECONDS * days));

        return df.format(date);
    }

    /**
     * 驗證是否合法的yyyyMMdd時間格式
     * @param strDate 時間
     * @return        是否合法
     */
    public static boolean isValidShortDateFormat(String strDate) {
        if (strDate.length() != SHORT_FORMAT.length()) {
            return false;
        }

        try {
            Integer.parseInt(strDate); //---- 避免日期中輸入非數字 ----
        } catch (Exception NumberFormatException) {
            return false;
        }

        DateFormat df = getNewDateFormat(SHORT_FORMAT);

        try {
            df.parse(strDate);
        } catch (ParseException e) {
            return false;
        }

        return true;
    }

    /**
     * 驗證是否合法的yyyyMMdd時間格式
     * @param strDate   時間   
     * @param delimiter 替換字元
     * @return          是否合法
     */
    public static boolean isValidShortDateFormat(String strDate, String delimiter) {
        String temp = strDate.replaceAll(delimiter, "");

        return isValidShortDateFormat(temp);
    }

    /**
     * 判斷表示時間的字元是否為符合yyyyMMddHHmmss格式
     * 
     * @param strDate 時間
     * @return        轉換後的時間
     */
    public static boolean isValidLongDateFormat(String strDate) {
        if (strDate.length() != LONG_FORMAT.length()) {
            return false;
        }

        try {
            Long.parseLong(strDate); //---- 避免日期中輸入非數字 ----
        } catch (Exception NumberFormatException) {
            return false;
        }

        DateFormat df = getNewDateFormat(LONG_FORMAT);

        try {
            df.parse(strDate);
        } catch (ParseException e) {
            return false;
        }

        return true;
    }

    /**
     * 判斷表示時間的字元是否為符合yyyyMMddHHmmss格式
     * 
     * @param strDate    時間
     * @param delimiter  替換字元
     * @return           轉換後的時間
     */
    public static boolean isValidLongDateFormat(String strDate, String delimiter) {
        String temp = strDate.replaceAll(delimiter, "");

        return isValidLongDateFormat(temp);
    }

    /**
     * 獲得yyyyMMdd格式的時間
     * @param strDate 日期
     * @return        格式化後的時間
     */
    public static String getShortDateString(String strDate) {
        return getShortDateString(strDate, "-|/");
    }

    /**
     * 獲得yyyyMMdd格式的時間
     * @param strDate   日期
     * @param delimiter
     * @return          格式化後的時間
     */
    public static String getShortDateString(String strDate, String delimiter) {
        if (StringUtil.isBlank(strDate)) {
            return null;
        }

        String temp = strDate.replaceAll(delimiter, "");

        if (isValidShortDateFormat(temp)) {
            return temp;
        }

        return null;
    }

    /**
     * 獲得每個月的第一天
     * @return 獲得每個月的第一天
     */
    public static String getShortFirstDayOfMonth() {
        Calendar cal = Calendar.getInstance();
        Date dt = new Date();

        cal.setTime(dt);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        DateFormat df = getNewDateFormat(SHORT_FORMAT);

        return df.format(cal.getTime());
    }

    /**
     * 獲得指定日期當月的第一天
     * @return 獲得指定日期當月的第一天
     */
    public static Date getFirstDayofMonth(Date date) {
        Calendar cal = Calendar.getInstance();

        cal.setTime(date);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        return cal.getTime();

    }

    /**
     * 獲得指定日期當月的第一天零時
     * @return 獲得指定日期當月的第一天零時
     */
    public static Date getFirstDayofMonthToZero(Date date) {
        Calendar cal = Calendar.getInstance();

        cal.setTime(date);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);

        return cal.getTime();

    }

    /**
     * 獲得yyyy-MM-dd時間格式
     * @return 獲得yyyy-MM-dd時間格式
     */
    public static String getWebTodayString() {
        DateFormat df = getNewDateFormat(WEB_FORMAT);

        return df.format(new Date());
    }

    /**
     * 獲得每個月的第一天,以yyyy-MM-dd格式
     * @return 獲得每個月的第一天
     */
    public static String getWebFirstDayOfMonth() {
        Calendar cal = Calendar.getInstance();
        Date dt = new Date();

        cal.setTime(dt);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        DateFormat df = getNewDateFormat(WEB_FORMAT);

        return df.format(cal.getTime());
    }

    /**
     * 將時間從一種格式轉換成另一種格式
     * @param dateString 時間
     * @param formatIn   轉換前的格式
     * @param formatOut  轉換後的格式
     * @return           轉換後的時間
     */
    public static String convert(String dateString, DateFormat formatIn, DateFormat formatOut) {
        try {
            Date date = formatIn.parse(dateString);

            return formatOut.format(date);
        } catch (ParseException e) {
            LOGGER.warn("convert() --- orign date error: " + dateString);
            return "";
        }
    }

    /**
     * 將時間轉換成yyyy-MM-dd格式
     * @param dateString 時間
     * @return           轉換後的時間
     */
    public static String convert2WebFormat(String dateString) {
        DateFormat df1 = getNewDateFormat(SHORT_FORMAT);
        DateFormat df2 = getNewDateFormat(WEB_FORMAT);

        return convert(dateString, df1, df2);
    }

    /**
     * 將yyyy-MM-dd HH:mm:ss時間轉換成yyyyMMdd格式
     * @param dateString 時間
     * @return           轉換後的時間
     */
    public static String convert2ShortFormat(String dateString) {
        DateFormat df1 = getNewDateFormat(NEW_FORMAT);
        DateFormat df2 = getNewDateFormat(SHORT_FORMAT);

        return convert(dateString, df1, df2);
    }

    /**
     * 將時間轉換成yyyy年MM月dd日時間格式
     * @param dateString 時間
     * @return           轉換後的時間
     */
    public static String convert2ChineseDtFormat(String dateString) {
        DateFormat df1 = getNewDateFormat(SHORT_FORMAT);
        DateFormat df2 = getNewDateFormat(CHINESE_DT_FORMAT);

        return convert(dateString, df1, df2);
    }

    /**
     * 從yyyy年MM月dd日時間格式轉換
     * @param dateString 轉換前的時間
     * @return           轉換後的時間
     */
    public static String convertFromWebFormat(String dateString) {
        DateFormat df1 = getNewDateFormat(SHORT_FORMAT);
        DateFormat df2 = getNewDateFormat(WEB_FORMAT);

        return convert(dateString, df2, df1);
    }

    /**
     * 比較兩個時間的大小
     * @param date1 時間1
     * @param date2 時間2
     * @return      是否不小於
     */
    public static boolean webDateNotLessThan(String date1, String date2) {
        DateFormat df = getNewDateFormat(WEB_FORMAT);

        return dateNotLessThan(date1, date2, df);
    }

    /**
     * 比較兩個時間的大小
     * @param date1 時間1
     * @param date2 時間2
     * @param format yyyy-MM-dd格式的時間
     *
     * @return       是否不小於
     */
    public static boolean dateNotLessThan(String date1, String date2, DateFormat format) {
        try {
            Date d1 = format.parse(date1);
            Date d2 = format.parse(date2);

            return d1.after(d2);
        } catch (ParseException e) {
            LOGGER.error("dateNotLessThan() --- ParseException(" + date1 + ", " + date2 + ")", e);
            return false;
        }
    }

    /**
     * 獲取yyyy年MM月dd日HH:mm:ss格式的時間
     * @param today 今天的時間
     * @return      轉換後的時間
     */
    public static String getEmailDate(Date today) {
        String todayStr;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");

        todayStr = sdf.format(today);
        return todayStr;
    }

    /**
     * 獲取MM月dd日HH:mm格式的時間
     * @param today 今天的時間
     * @return      轉換後的時間
     */
    public static String getSmsDate(Date today) {
        String todayStr;
        SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日HH:mm");

        todayStr = sdf.format(today);
        return todayStr;
    }

    /**
     * 格式化時間段
     * @param startDate 開始時間
     * @param endDate   結束時間
     * @param format    指定格式
     * @return          轉換後的時間
     */
    public static String formatTimeRange(Date startDate, Date endDate, String format) {
        if ((endDate == null) || (startDate == null)) {
            return null;
        }

        String rt = null;
        long range = endDate.getTime() - startDate.getTime();
        long day = range / DateUtils.MILLIS_PER_DAY;
        long hour = (range % DateUtils.MILLIS_PER_DAY) / DateUtils.MILLIS_PER_HOUR;
        long minute = (range % DateUtils.MILLIS_PER_HOUR) / DateUtils.MILLIS_PER_MINUTE;

        if (range < 0) {
            day = 0;
            hour = 0;
            minute = 0;
        }

        rt = format.replaceAll("dd", String.valueOf(day));
        rt = rt.replaceAll("hh", String.valueOf(hour));
        rt = rt.replaceAll("mm", String.valueOf(minute));

        return rt;
    }

    /**
     * 格式月
     * @param date 格式化前的時間
     * @return     格式化後的時間
     */
    public static String formatMonth(Date date) {
        if (date == null) {
            return null;
        }

        return new SimpleDateFormat(MONTH_FORMAT).format(date);
    }

    /**
     * 獲取系統日期的前一天日期,返回Date
     *
     * @return 前一天日期
     */
    public static Date getBeforeDate() {
        Date date = new Date();

        return new Date(date.getTime() - (ONE_DAY_MILL_SECONDS));
    }

    /**
     * 獲得指定時間當天起點時間
     * 
     * @param date 當前時間
     * @return 當天起點時間
     */
    public static Date getDayBegin(Date date) {
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        df.setLenient(false);

        String dateString = df.format(date);

        try {
            return df.parse(dateString);
        } catch (ParseException e) {
            return date;
        }
    }

    /**
     * 判斷參date上min分鐘後,是否小於當前時間
     * @param date 當前時間
     * @param min  分鐘數
     * @return     是否小於當前時間
     */
    public static boolean dateLessThanNowAddMin(Date date, long min) {
        return addMinutes(date, min).before(new Date());

    }

    /**
     * 是否在當前時間之前
     * @param date 當前時間
     * @return     是否在當前時間之前
     */
    public static boolean isBeforeNow(Date date) {
        if (date == null)
            return false;
        return date.compareTo(new Date()) < 0;
    }

    /**
     * 轉換成yyyy-MM-dd HH:mm時間格式
     * @param sDate 轉換前的時間
     * @return      轉換後的時間
     * @throws ParseException   時間格式化問題
     */
    public static Date parseNoSecondFormat(String sDate) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat(NO_SECOND_FORMAT);

        if ((sDate == null) || (sDate.length() < NO_SECOND_FORMAT.length())) {
            throw new ParseException("length too little", 0);
        }

        return dateFormat.parse(sDate);
    }

    /**
     * 返回日期的時分
     * @param date 當前時間
     * @return     日期的時分
     */
    public static String getFormatDate(Date date) {
        if (date == null)
            return null;
        String strDate = format(date, DateUtil.NO_SECOND_FORMAT);
        return StringUtil.substring(strDate, 11);
    }

    /**
     * 獲得前一天的時間
     *
     * @return 
     */
    public static Date getBeforeFormatDate() throws ParseException {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_MONTH, -1);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = formatter.format(c.getTime());
        return formatter.parse(dateStr);
    }

    /**
     * 獲取指定時間的後一天時間
     *
     * @param sdate 指定的時間
     * @return      指定時間的後一天
     * @throws ParseException
     */
    public static Date getAfterFormatDate(Date sdate) throws ParseException {
        Calendar c = Calendar.getInstance();
        c.setTime(sdate);
        c.add(Calendar.DAY_OF_MONTH, 1);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = formatter.format(c.getTime());
        return formatter.parse(dateStr);
    }

    /**
     * 獲取上個月當天00:00:00
     *
     * @return date
     */
    public static Date getTodayBeforeThisMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        if (month == 0) {
            year = year - 1;
            month = 11;
        } else {
            month = month - 1;
        }
        calendar.set(year, month, day, 00, 00, 00);
        return calendar.getTime();
    }

    /**
     * 獲取當天23:59:59
     *
     * @return Date
     */
    public static Date getTodayLastSecond() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.set(year, month, day, 23, 59, 59);
        return calendar.getTime();
    }

    /**
     * 獲取指定日期23:59:59
     *
     * @return Date
     */
    public static Date getLastSecond(Date date) {
        if (date == null) {
            return date;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.set(year, month, day, 23, 59, 59);
        return calendar.getTime();
    }

    /**
     * 通過格式化字串(如"yyyy-MM-dd HH:mm")獲取format物件
     * @param format 格式化字串
     * @return DateFormat format物件
     */
    public static final DateFormat getFormat(String format) {
        return new SimpleDateFormat(format);
    }

    /**
     * 轉換日期格式字串
     *
     * @param date "2010.10.21"
     * @param time "00:00"
     * @return "2010-10-21 00:00"
     */
    public static String getFormatString(String date, String time, String defaultTime) {
        if (StringUtil.isNotBlank(date)) {
            date = date.replace(".", "-");
            return StringUtil.trim(date) + " "
                   + (StringUtil.isNotBlank(time) ? StringUtil.trim(time) : defaultTime);
        }
        return null;
    }

    /**
     * 字串  2005-06-30 15:50 轉換成時間
     * @param date String
     * @return
     * @throws ParseException 
     */
    public static final Date simpleFormatDate(String dateString) throws ParseException {
        if (dateString == null) {
            return null;
        }
        return getFormat(NO_SECOND_FORMAT).parse(dateString);
    }

    /**
     * 獲取HH:SS時間
     *  
     * @param endDate 操作時間
     * @param type 時間型別 1:時間往後移,
     *  例如:當前時間為2012-08-30 14:12:00返回時間為2012-08-30 14:30:00   
     *       當前時間為2012-08-30 14:31:00返回時間為2012-08-30 15:00:00  
     * 時間型別2:時間往前移
     *       當前時間為2012-08-30 14:35:00返回時間為2012-08-30 14:30:00   
     *       當前時間為2012-08-30 14:25:00返回時間為2012-08-30 14:00:00  
     * @return 時分
     */
    public static String gethoursFormatBeforeAndAfter(Date endDate, String type) {

        //當前小時
        String beforTime = StringUtil.substring(DateUtil.getHoursFormatDateString(endDate), 0, 2);
        //當前分鐘
        String endTimeTemp = StringUtil.substring(DateUtil.getHoursFormatDateString(endDate), 3, 5);

        int endTime = Integer.parseInt(endTimeTemp);

        //當type等於1時間往後靠,說明取的是結束時間,其它情況取的是開始時間,開始時間往遷移
        if (StringUtil.equals(type, "1")) {

            // 如果當前分鐘小於等於30預設為30,例如當前時間為1:25,預設為1:30
            if (endTime <= 30) {
                endTime = 30;
                return beforTime = beforTime + ":" + endTime;
            }
            //如果當前分鐘大於30預設往前追加一個小時,例如當前時間為1:35,預設為2:00
            Date endDateTemp = DateUtil.addHours(endDate, 1);
            beforTime = StringUtil.substring(DateUtil.getHoursFormatDateString(endDateTemp), 0, 2)
                        + ":00";

            return beforTime;
        }

        // 如果當前分鐘大於等於30預設為30,例如當前時間為1:35,預設為1:30
        if (endTime >= 30) {
            endTime = 30;
            return beforTime = beforTime + ":" + endTime;
        }

        // 如果當前分鐘小於30預設為30,例如當前時間為1:25,預設為1:00
        return beforTime + ":00";

    }

    /**
     * 在日期上增加數個整月
     * 
     * @param date
     * @param n
     * @return
     */
    public static Date addMonth(Date date, int n) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, n);
        return cal.getTime();
    }

    /**
     * 加減天數
     * 
     * @param date
     * @return Date
     * @author shencb 2006-12 add
     */
    public static final Date increaseDate(Date aDate, int days) {
        Calendar cal = Calendar.getInstance();

        cal.setTime(aDate);
        cal.add(Calendar.DAY_OF_MONTH, days);
        return cal.getTime();
    }

    /**
     * 比較兩個時間的大小
     * @param date1 時間1
     * @param date2 時間2
     * @return      是否不小於
     */
    public static boolean longFormatNotLessThan(String date1, String date2) {
        DateFormat df = getNewDateFormat(LONG_FORMAT);

        return dateNotLessThan(date1, date2, df);
    }

    /**
     * 比較兩個時間的大小 web格式
     * @param date1 時間1
     * @param date2 時間2
     * @return      是否不小於
     */
    public static boolean longFormatNotLessThan(String date1, String date2, String format) {
        DateFormat df = getNewDateFormat(format);

        return dateNotLessThan(date1, date2, df);
    }

    /**
     * 返回長日期格式(yyyyMMddHHmmss格式)
     *
     * @param stringDate
     *
     * @return
     *
     * @throws ParseException
     */
    public static final String longDate(Date Date) {
        if (Date == null) {
            return null;
        }

        return getFormat(LONG_FORMAT).format(Date);
    }

    /**
     * 獲取日期是星期幾
     * @param dt
     * @return
     */
    public static int getWeekOfDate(Date dt) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return w;
    }

    /**
     * 比較兩個時間的大小
     * @param date1 時間1
     * @param date2 時間2
     * @return      是否不小於
     */
    public static boolean newFormatNotLessThan(String date1, String date2) {
        DateFormat df = getNewDateFormat(NEW_FORMAT);

        return dateNotLessThan(date1, date2, df);
    }

    /**
     * 將yyyy-MM-dd時間轉換成yyyyMMdd格式
     * @param dateString 時間
     * @return           轉換後的時間
     */
    public static String convertWebFormat2ShortFormat(String dateString) {
        DateFormat df1 = getNewDateFormat(WEB_FORMAT);
        DateFormat df2 = getNewDateFormat(SHORT_FORMAT);

        return convert(dateString, df1, df2);
    }

    /**
     * 從開始日期,到新增天數期間內,非工作日統計
     * 
     * @param startDate 開始日期
     * @param addDay 增加天數
     * @return 非工作日天數
     */
    public static int countWeek(Date startDate, int addDay) {
        int countWeek = 0;
        for (int i = 1; i <= addDay; i++) {
            int week = DateUtil.getWeekOfDate(DateUtil.increaseDate(startDate, +i));
            if (week == 0 || week == 6) {
                countWeek++;
            }
        }
        return countWeek;
    }

    /**
     * 
     * 根據星期獲取,星期對應的日期;
     * 如果srcWeek日期超過當前日期,將獲取下一週對應星期的日期
     * @param date 起始日期
     * @param srcWeek 星期幾
     * @return
     */
    public static Date getDayByWeek(Date date, int srcWeek) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int currWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (srcWeek - currWeek >= 0) {
            cal.add(Calendar.DAY_OF_YEAR, srcWeek - currWeek);
        } else {

            cal.add(Calendar.DAY_OF_YEAR, 7 + srcWeek - currWeek);
        }
        return cal.getTime();
    }

    /**
     * 根據開始日期和需要的工作日天數獲取加上指定天數工作日後的日期
     * 
     * @param startDate 開始日期
     * @param workDay 工作日天數
     * @return 指定天數工作日後的日期
     */
    public static Date getWorkDay(Date startDate, int workDay) {
        Calendar c = Calendar.getInstance();
        c.setTime(startDate);
        for (int i = 0; i < workDay; i++) {
            // 判斷當天是否為週末,如果是週末加1
            if (Calendar.SATURDAY == c.get(Calendar.SATURDAY)
                || Calendar.SUNDAY == c.get(Calendar.SUNDAY)) {
                workDay = workDay + 1;
                c.set(Calendar.DATE, c.get(Calendar.DATE) + 1);
                continue;
            }
            c.set(Calendar.DATE, c.get(Calendar.DATE) + 1);
            // 當天數加1,判斷是否為週末,如果是週末加1
            if (Calendar.SATURDAY == c.get(Calendar.SATURDAY)
                || Calendar.SUNDAY == c.get(Calendar.SUNDAY)) {
                workDay = workDay + 1;
                c.set(Calendar.DATE, c.get(Calendar.DATE) + 1);
                continue;
            }
        }
        return c.getTime();
    }

    /**
     * 
     * 除去週末,計算日期
     * 
     * @param sDate 開始時間
     * @param n 往後推天數
     * @return 後推add天數日期
     */
    public static Date getAfterDate(Date sDate, int n) {
        Date t = sDate;
        for (int i = 1; i <= n;) {
            t = DateUtil.increaseDate(t, +1);
            int week = DateUtil.getWeekOfDate(t);
            if (week != 6 && week != 0) {
                i++;
            }
        }
        return t;
    }
    
    /**
     * 把long時間轉換為字串
     * 
     * @param millSec
     * @return
     */
    public static String transferLongToDate(long millSec) {
        SimpleDateFormat sdf = new SimpleDateFormat(NEW_FORMAT);
        Date date = new Date(millSec);
        return sdf.format(date);
    }
}
        } catch (Exception e) {
           
        }
        return false;
    }

}



相關文章