關於時間格式的學習筆記

	/**
	 * 獲得遞增數天後的時間
	 * @param date
	 * @param amount 可以爲任意整數
	 * @return
	 */
	public static Date addDays(Date date,int amount){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, amount);
		return cal.getTime();
	}

package com.***.basedemo.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.***.framework.exception.DataBaseException;

/**
 * 
 * 日期操作工具類
 * 本類不能從org.apache.commons.lang.time.DateUtils繼承,跟WebLogic下的jar包有衝突
 * 
 * @author cc
 * @version 1.0 2013-9-8 
 * @version 1.0
 */
public class DhccDateUtils {
       
    public static final String DATE_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.SSS";

    public static final String DATE_FORMAT_LONG = "yyyy-MM-dd HH:mm:ss";

    public static final String DATE_FORMAT_SHORT = "yyyy-MM-dd";
    
    /**
     * 將日期格式化爲"yyyy-MM-dd"格式的日期
     */
    public static Date date2SimpleDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //清除時、分、秒、毫秒
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }
    
    /**
     * 將日期格式化爲指定格式的日期
     */
    public static Date date2FormatDate(Date date,String formatStr) {
        String tmp = dateToStr(date, formatStr);
        return strToDate(tmp, formatStr);
    }

    /**
     * 返回格式化的日期字符串
     * 
     * @param date
     *        日期
     * @param format
     *        格式
     * @return 格式化的日期字符串
     */
    public static String dateToStr(Date date, String format)
    {
        if (date == null) {
            return null;
        }
        DateFormat df = new SimpleDateFormat(format);
        return df.format(date);
    }

    /**
     * 返回格式化的日期字符串
     * 
     * @param date
     *        日期
     * @return 格式化的日期字符串
     */
    public static String dateToStr(Date date)
    {
        return dateToStr(date, DATE_FORMAT_LONG);
    }
    
    /**
          返回格式化的日期字符串(帶T)
     * @param date
     * @return
     */
    public static String dateToTStr(Date date) {
        String dateStr = dateToStr(date,"yyyy-MM-dd&HH:mm:ss");
        return dateStr.replace('&', 'T');
    }

    /**
     * 將字符串轉換爲日期
     * 
     * @param dateStr
     *        日期字符串
     * @param format
     *        格式
     * @return 日期
     * @throws ParseException
     */
    public static Date strToDate(String dateStr, String format)
    {
        if (dateStr == null) {
            return null;
        }
        DateFormat df = new SimpleDateFormat(format);
        try {
            return df.parse(dateStr);
        }
        catch (ParseException e) {
            throw new DataBaseException(dateStr+"  "+format,e);
        }
    }
    
    /**
     * 將字符串轉換爲日期
     * 
     * @param dateStr
     *        日期字符串
     * @return 日期
     * @throws ParseException
     */
    public static Date strToDate(String dateStr)
    {
        return strToDate(dateStr, DATE_FORMAT_LONG);
    }

    /**
     * 判斷字符串是否爲日期類型("yyyy-MM-dd")
     * @param dateStr 字符串
     * @return true是日期類型,否則返回false
     */
    public static boolean isDate(String dateStr) {
        return dateStr.matches("^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$");
    }

    /**
     * 判斷字符串是否爲日期帶時間類型("yyyy-MM-dd HH:mm:ss")
     * @param dateStr 字符串
     * @return true是日期帶時間類型,否則返回false
     */
    public static boolean isDateTime(String dateStr) {
        return dateStr.matches("^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)) (([01]{1}\\d{1}|2[0-3]{1}):[0-5]{1}\\d{1}:[0-5]{1}\\d{1})$");
    }

    /**
     * 判斷字符串是否爲時間類型("HH:mm:ss")
     * @param dateStr 字符串
     * @return true是時間類型,否則返回false
     */
    public static boolean isTime(String dateStr) {
        return dateStr.matches("^([01]{1}\\d{1}|2[0-3]{1}):[0-5]{1}\\d{1}:[0-5]{1}\\d{1}$");
    }
    
    /**
     * 日期增加或減去某個天數
     * 
     * @param dt   需要操作的時間
     * @param num  增加或減去的天數
     * @return   返回操作後的時間
     */
    public static Date getBeforeOrAfterDate(Date dt,int num){
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        cal.add(Calendar.DATE, num);
        return cal.getTime();
     }
    
    /**
     * 日期增加或減去某個時間單位數
     * 
     * @param dt      需要操作的時間
     * @param num     增加或減去的天數
     * @param typ    時間單位類型(年,月,日,星期,分鐘等)
     * @return       返回操作後的時間
     */
    public static Date getBeforeOrAfterDate(Date dt,int num, int field){
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        cal.add(field, num);
        return cal.getTime();
    }
    
    /**
     * 日期增加或減去某個天數
     * 
     * @param dt
     *            需要操作的時間字符串
     * @param num
     *            增加或減去的天數
     * @return 返回操作後的時間字符串
     */
    public static String getBeforeOrAfterDate(String dt, int num) {
        if (isDate(dt)) {
            Date nextDate = getBeforeOrAfterDate(strToDate(dt,
                    DATE_FORMAT_SHORT), num);
            return dateToStr(nextDate, DATE_FORMAT_SHORT);
        } else if (isDateTime(dt)) {
            Date nextDate = getBeforeOrAfterDate(
                    strToDate(dt, DATE_FORMAT_LONG), num);
            return dateToStr(nextDate, DATE_FORMAT_LONG);
        }
        return null;
    }
    
    /**
     * 日期增加或減去某個天數
     * 
     * @param dt
     *            需要操作的時間字符串
     * @param num
     *            增加或減去的天數
     * @param format
     *            返回的日期字符串格式
     * 
     * @return 返回操作後的時間字符串 ,帶格式format
     */
    public static String getBeforeOrAfterDate(String dt, int num, String format) {
        Date nextDate = null;
        if (isDate(dt)) {
            nextDate = getBeforeOrAfterDate(strToDate(dt, DATE_FORMAT_SHORT),
                    num);
        } else if (isDateTime(dt)) {
            nextDate = getBeforeOrAfterDate(strToDate(dt, DATE_FORMAT_LONG),
                    num);
        }
        return dateToStr(nextDate, format);
    }
    
    /**
     * 返回日期是星期幾
     * Calendar.SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
     * 
     * @param dt
     * @return
     */
    public static int getDayOfWeek(Date dt){
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        return cal.get(Calendar.DAY_OF_WEEK);
     }
    
    /**
     * 判斷兩個日期區間是否有交集
     * 
     * @param a1 第一個日期區間的首日日期
     * @param a2 第一個日期區間的末日日期
     * @param b1 第二個日期區間的首日日期
     * @param b2 第二個日期區間的末日日期
     * 
     * @return  有交集返回true, 沒交集返回false
     */
    public static boolean hasIntersection(Date a1, Date a2, Date b1, Date b2) {
        if ((a1.before(b1) && (a2.after(b1) || a2.equals(b1))) || 
                ((a1.after(b1) || a1.equals(b1))) && ((a1.before(b2)) || (a1.equals(b2)))) 
            return true;
        return false;
    }
    
    /**
     * 返回指定日期的月份
     * 
     * @param date        日期
     * @return             月份
     */
    public static String getMonthByDate(Date date) {
       Calendar calendar = Calendar.getInstance();
       calendar.setTime(date);
       return String.valueOf(calendar.get(Calendar.MONTH) + 1);
    }
    
    /**
     * 返回月份所在季度 
     */
    public static String getQuarterByMonth(String mon) {
        int month = Integer.parseInt(mon);
        return String.valueOf((month-1) / 3 + 1); 
    }

    /**
     * 返回兩個日期小時差
     */
    public static double getHour(Date d1, Date d2) {
        if (d1 == null || d2 == null) {
            return 0;
        }
        long ms = getMilliSecond(d1, d2);
        return ms/1000.00/60/60;
    }
    
    /**
     * 返回兩個日期天數差
     */
    public static long getDay(Date d1, Date d2){
        if (d1 == null || d2 == null) {
            return 0;
        }
        long ms = getMilliSecond(d1, d2);
        return ms/1000/60/60/24;
    }
    
    /**
     * 返回兩個日期毫秒差
     */
    public static long getMilliSecond(Date d1, Date d2) {
        long d1MS = d1.getTime();
        long d2MS = d2.getTime();
        return Math.abs(d1MS - d2MS);
    }
    
    /**
     * 獲得遞增數秒後的時間
     * @param date
     * @param amount 可以爲任意整數
     * @return
     */
    public static Date addSeconds(Date date,int amount){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.SECOND, amount);
        return cal.getTime();
    }
    
    /**
     * 獲得遞增數分鐘後的時間
     * @param date
     * @param amount 可以爲任意整數
     * @return
     */
    public static Date addMinutes(Date date,int amount){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, amount);
        return cal.getTime();
    }
    
    /**
     * 獲得遞增數小時後的時間
     * @param date
     * @param amount 可以爲任意整數
     * @return
     */
    public static Date addHours(Date date,int amount){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, amount);
        return cal.getTime();
    }
    
    /**
     * 獲得遞增數天後的時間
     * @param date
     * @param amount 可以爲任意整數
     * @return
     */
    public static Date addDays(Date date,int amount){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, amount);
        return cal.getTime();
    }
    
    /**
     * 在日期上加月數
     * @param sDate
     * @param num
     * @return
     */
    public static Date addMonths(Date sDate,int num){
        Calendar cal = Calendar.getInstance();
        cal.setTime(sDate);
        cal.add(Calendar.MONTH, num);
        return cal.getTime();
    }
    
    /**
     * 獲得遞增數年後的時間
     * @param date
     * @param amount 可以爲任意整數
     * @return
     */
    public static Date addYears(Date date,int amount){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.YEAR, amount);
        return cal.getTime();
    }
    
    /**
     * 獲取某月的天數
     * 
     * @param year
     *        年份
     * @param month
     *        月份
     * @return 天數
     */
    public static int getDaysByMonth(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(year, month, 0);
        return c.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    
    /**
     * 根據年月日獲取時間
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 返回指定時間
     */
    public static Date getDate(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, day);
        return calendar.getTime();
    }
    
    /**
     * 返回兩個日期的分鐘數差
     */
    public static long getMinute(Date d1, Date d2) {
        if (d1 == null || d2 == null) {
            return 0;
        }
        long ms = getMilliSecond(d1, d2);
        return ms/1000/60;
    }

    //以下方法從org.apache.commons.lang.time.DateUtils拷貝過來(爲兼容以前代碼)
    /**
     * 截取時間(後面填充0,如filed取值Calendar.DAY_OF_MONTH,
     *         則返回的時間格式爲“yyyy-MM-dd”,時、分、秒、毫秒均爲0)
     * @param date 時間
     * @param field 時間字段
     * @return 截取後的時間
     */
    public static Date truncate(Date date, int field) {
        if (date == null) {
            throw new IllegalArgumentException("The date must not be null");
        } else {
            Calendar gval = Calendar.getInstance();
            gval.setTime(date);
            modify(gval, field, false);
            return gval.getTime();
        }
    }

    /**
     * 截取時間(後面填充0,如filed取值Calendar.DAY_OF_MONTH,
     *         則返回的時間格式爲“yyyy-MM-dd”,時、分、秒、毫秒均爲0)
     * @param date 時間
     * @param field 時間字段
     * @return 截取後的時間
     */
    public static Calendar truncate(Calendar date, int field) {
        if (date == null) {
            throw new IllegalArgumentException("The date must not be null");
        } else {
            Calendar truncated = (Calendar) date.clone();
            modify(truncated, field, false);
            return truncated;
        }
    }

    /**
     * 截取時間(後面填充0,如filed取值Calendar.DAY_OF_MONTH,
     *         則返回的時間格式爲“yyyy-MM-dd”,時、分、秒、毫秒均爲0)
     * @param date 時間
     * @param field 時間字段
     * @return 截取後的時間
     */
    public static Date truncate(Object date, int field) {
        if (date == null)
            throw new IllegalArgumentException("The date must not be null");
        if (date instanceof Date)
            return truncate((Date) date, field);
        if (date instanceof Calendar)
            return truncate((Calendar) date, field).getTime();
        else
            throw new ClassCastException("Could not truncate " + date);
    }

    private static final int fields[][] = { { 14 }, { 13 }, { 12 }, { 11, 10 },
        { 5, 5, 9 }, { 2, 1001 }, { 1 }, { 0 } };

    private static void modify(Calendar val, int field, boolean round) {
        if (val.get(1) > 280000000)
            throw new ArithmeticException(
                    "Calendar value too large for accurate calculations");
        if (field == 14)
            return;
        Date date = val.getTime();
        long time = date.getTime();
        boolean done = false;
        int millisecs = val.get(14);
        if (!round || millisecs < 500)
            time -= millisecs;
        if (field == 13)
            done = true;
        int seconds = val.get(13);
        if (!done && (!round || seconds < 30))
            time -= (long) seconds * 1000L;
        if (field == 12)
            done = true;
        int minutes = val.get(12);
        if (!done && (!round || minutes < 30))
            time -= (long) minutes * 60000L;
        if (date.getTime() != time) {
            date.setTime(time);
            val.setTime(date);
        }
        boolean roundUp = false;
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < fields[i].length; j++)
                if (fields[i][j] == field) {
                    if (round && roundUp)
                        if (field == 1001) {
                            if (val.get(5) == 1) {
                                val.add(5, 15);
                            } else {
                                val.add(5, -15);
                                val.add(2, 1);
                            }
                        } else {
                            val.add(fields[i][0], 1);
                        }
                    return;
                }

            int offset = 0;
            boolean offsetSet = false;
            switch (field) {
            case 1001:
                if (fields[i][0] == 5) {
                    offset = val.get(5) - 1;
                    if (offset >= 15)
                        offset -= 15;
                    roundUp = offset > 7;
                    offsetSet = true;
                }
                break;

            case 9: // '\t'
                if (fields[i][0] == 11) {
                    offset = val.get(11);
                    if (offset >= 12)
                        offset -= 12;
                    roundUp = offset > 6;
                    offsetSet = true;
                }
                break;
            }
            if (!offsetSet) {
                int min = val.getActualMinimum(fields[i][0]);
                int max = val.getActualMaximum(fields[i][0]);
                offset = val.get(fields[i][0]) - min;
                roundUp = offset > (max - min) / 2;
            }
            if (offset != 0)
                val.set(fields[i][0], val.get(fields[i][0]) - offset);
        }

        throw new IllegalArgumentException("The field " + field
                + " is not supported");
    }
    //以上方法從org.apache.commons.lang.time.DateUtils拷貝過來
    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章