關於時間計算的工具類 DateTool

package com.dcc.server.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.Vector;

/**
 * 時間工具類 
 */
public class DateTool {
	
	
	
	/**  
     * 對日期(時間)中的日進行加減計算. <br>  
     * 例子: <br>  
     * 如果Date類型的d爲 2005年8月20日,那麼 <br>  
     * calculateByDate(d,-10)的值爲2005年8月10日 <br>  
     * 而calculateByDate(d,+10)的值爲2005年8月30日 <br>  
     *   
     * @param d  
     *            日期(時間).  
     * @param amount  
     *            加減計算的幅度.+n=加n天;-n=減n天.  
     * @return 計算後的日期(時間).  
     */  
    public static Date calculateByDate(Date d, int amount) {   
        return calculate(d, GregorianCalendar.DATE, amount);   
    }   
       
    public static Date calculateByMinute(Date d, int amount) {   
        return calculate(d, GregorianCalendar.MINUTE, amount);   
    }   
       
    public static Date calculateByYear(Date d, int amount) {   
        return calculate(d, GregorianCalendar.YEAR, amount);   
    }   
  
    /**  
     * 對日期(時間)中由field參數指定的日期成員進行加減計算. <br>  
     * 例子: <br>  
     * 如果Date類型的d爲 2005年8月20日,那麼 <br>  
     * calculate(d,GregorianCalendar.YEAR,-10)的值爲1995年8月20日 <br>  
     * 而calculate(d,GregorianCalendar.YEAR,+10)的值爲2015年8月20日 <br>  
     *   
     * @param d  
     *            日期(時間).  
     * @param field  
     *            日期成員. <br>  
     *            日期成員主要有: <br>  
     *            年:GregorianCalendar.YEAR <br>  
     *            月:GregorianCalendar.MONTH <br>  
     *            日:GregorianCalendar.DATE <br>  
     *            時:GregorianCalendar.HOUR <br>  
     *            分:GregorianCalendar.MINUTE <br>  
     *            秒:GregorianCalendar.SECOND <br>  
     *            毫秒:GregorianCalendar.MILLISECOND <br>  
     * @param amount  
     *            加減計算的幅度.+n=加n個由參數field指定的日期成員值;-n=減n個由參數field代表的日期成員值.  
     * @return 計算後的日期(時間).  
     */  
    private static Date calculate(Date d, int field, int amount) {   
        if (d == null)   
            return null;   
        GregorianCalendar g = new GregorianCalendar();   
        g.setGregorianChange(d);   
        g.add(field, amount);   
        return g.getTime();   
    }   
  
    /**  
     * 日期(時間)轉化爲字符串.  
     *   
     * @param formater  
     *            日期或時間的格式.  
     * @param aDate  
     *            java.util.Date類的實例.  
     * @return 日期轉化後的字符串.  
     */  
    public static String date2String(String formater, Date aDate) {   
        if (formater == null || "".equals(formater))   
            return null;   
        if (aDate == null)   
            return null;   
        return (new SimpleDateFormat(formater)).format(aDate);   
    }   
  
    /**  
     * 當前日期(時間)轉化爲字符串.  
     *   
     * @param formater  
     *            日期或時間的格式.  
     * @return 日期轉化後的字符串.  
     */  
    public static String date2String(String formater) {   
        return date2String(formater, new Date());   
    }   
       
    /**  
     * 獲取當前日期對應的星期數.  
     * <br>1=星期天,2=星期一,3=星期二,4=星期三,5=星期四,6=星期五,7=星期六  
     * @return 當前日期對應的星期數  
     */  
    public static int dayOfWeek() {   
        GregorianCalendar g = new GregorianCalendar();   
        int ret = g.get(java.util.Calendar.DAY_OF_WEEK);   
        g = null;   
        return ret;   
    }   
  
  
    /**  
     * 獲取所有的時區編號. <br>  
     * 排序規則:按照ASCII字符的正序進行排序. <br>  
     * 排序時候忽略字符大小寫.  
     *   
     * @return 所有的時區編號(時區編號已經按照字符[忽略大小寫]排序).  
     */  
    public static String[] fecthAllTimeZoneIds() {   
        Vector v = new Vector();   
        String[] ids = TimeZone.getAvailableIDs();   
        for (int i = 0; i < ids.length; i++) {   
            v.add(ids[i]);   
        }   
        java.util.Collections.sort(v, String.CASE_INSENSITIVE_ORDER);   
        v.copyInto(ids);   
        v = null;   
        return ids;   
    }   
  
    /**  
     * 測試的main方法.  
     *   
     * @param argc  
     */  
    public static void main(String[] argc) {   
           
        String[] ids = fecthAllTimeZoneIds();   
        String nowDateTime =date2String("yyyy-MM-dd HH:mm:ss");   
        System.out.println("The time Asia/Shanhai is " + nowDateTime);//程序本地運行所在時區爲[Asia/Shanhai]   
        //顯示世界每個時區當前的實際時間   
        /*for(int i=0;i <ids.length;i++){   
            System.out.println(" * " + ids[i] + "=" + string2TimezoneDefault(nowDateTime,ids[i]));    
        } */  
        //顯示程序運行所在地的時區   
        //System.out.println("TimeZone.getDefault().getID()=" +TimeZone.getDefault().getID()); 
        
        System.out.println("美國時間爲: "+string2Timezone("yyyy-MM-dd HH:mm:ss","2016-05-07 05:44:32","yyyy-MM-dd HH:mm:ss","America/New_York"));
        System.out.println("中國時間爲: "+timezone2Local("yyyy-MM-dd HH:mm:ss","2016-05-07 05:44:32","America/New_York","yyyy-MM-dd HH:mm:ss"));
    }   
  
    /**  
     * 將系統日期時間字符串根據轉換爲指定時區的日期時間.  
     *   
     * @param srcFormater  
     *            待轉化的日期時間的格式.  
     * @param srcDateTime  
     *            待轉化的日期時間.  
     * @param dstFormater  
     *            目標的日期時間的格式.  
     * @param dstTimeZoneId  
     *            目標的時區編號.  
     *   
     * @return 轉化後的日期時間.  
     */  
    public static String string2Timezone(String srcFormater,   
            String srcDateTime, String dstFormater, String dstTimeZoneId) {   
        if (srcFormater == null || "".equals(srcFormater))   
            return null;   
        if (srcDateTime == null || "".equals(srcDateTime))   
            return null;   
        if (dstFormater == null || "".equals(dstFormater))   
            return null;   
        if (dstTimeZoneId == null || "".equals(dstTimeZoneId))   
            return null;   
        SimpleDateFormat sdf = new SimpleDateFormat(srcFormater);   
        try {   
            int diffTime = getDiffTimeZoneRawOffset(dstTimeZoneId);   
            Date d = sdf.parse(srcDateTime);   
            long nowTime = d.getTime();   
            long newNowTime = nowTime - diffTime;   
            d = new Date(newNowTime);   
            return date2String(dstFormater, d);   
        } catch (ParseException e) {   
            e.printStackTrace();
        	//Log.output(e.toString(), Log.STD_ERR);   
            return null;   
        } finally {   
            sdf = null;   
        }   
    }   
    
    /**  
     * 將輸入日期時間字符串根據輸入時區轉換爲系統時區的日期時間.  
     *   
     * @param srcFormater  
     *           輸入的日期時間的格式.  
     * @param srcDateTime  
     *           輸入的待轉化的日期時間.  
     * @param dstTimeZoneId
     *           輸入時間的時區編號   
     * @param dstFormater  
     *           系統本地的日期時間的格式. 
     *   
     * @return 轉化後的日期時間.  
     */  
    public static String timezone2Local(String srcFormater,   
            String srcDateTime, String dstTimeZoneId, String dstFormater) {   
        if (srcFormater == null || "".equals(srcFormater))   
            return null;   
        if (srcDateTime == null || "".equals(srcDateTime))   
            return null;   
        if (dstTimeZoneId == null || "".equals(dstTimeZoneId))   
            return null;    
        if (dstFormater == null || "".equals(dstFormater))   
            return null;  
        SimpleDateFormat sdf = new SimpleDateFormat(srcFormater);   
        try {   
            int diffTime = getDiffTimeZoneRawOffset(dstTimeZoneId); 
            Date d = sdf.parse(srcDateTime);   
            long nowTime = d.getTime();   
            long newNowTime = nowTime + diffTime;   
            d = new Date(newNowTime);   
            return date2String(dstFormater, d);   
        } catch (ParseException e) {   
            e.printStackTrace();
        	//Log.output(e.toString(), Log.STD_ERR);   
            return null;   
        } finally {   
            sdf = null;   
        }   
    }  
  
    /**  
     * 獲取系統當前默認時區與UTC的時間差.(單位:毫秒)  
     *   
     * @return 系統當前默認時區與UTC的時間差.(單位:毫秒)  
     */  
    private static int getDefaultTimeZoneRawOffset() {   
        return TimeZone.getDefault().getRawOffset();   
    }   
  
    /**  
     * 獲取指定時區與UTC的時間差.(單位:毫秒)  
     *   
     * @param timeZoneId  
     *            時區Id  
     * @return 指定時區與UTC的時間差.(單位:毫秒)  
     */  
    private static int getTimeZoneRawOffset(String timeZoneId) {   
        return TimeZone.getTimeZone(timeZoneId).getRawOffset();   
    }   
  
    /**  
     * 獲取系統當前默認時區與指定時區的時間差.(單位:毫秒)  
     *   
     * @param timeZoneId  
     *            時區Id  
     * @return 系統當前默認時區與指定時區的時間差.(單位:毫秒)  
     */  
    private static int getDiffTimeZoneRawOffset(String timeZoneId) {   
        return TimeZone.getDefault().getRawOffset()   
                - TimeZone.getTimeZone(timeZoneId).getRawOffset();   
    }   
  
    /**  
     * 將日期時間字符串根據轉換爲指定時區的日期時間.  
     *   
     * @param srcDateTime  
     *            待轉化的日期時間.  
     * @param dstTimeZoneId  
     *            目標的時區編號.  
     *   
     * @return 轉化後的日期時間.  
     * @see #string2Timezone(String, String, String, String)  
     */  
    public static String string2TimezoneDefault(String srcDateTime,   
            String dstTimeZoneId) {   
        return string2Timezone("yyyy-MM-dd HH:mm:ss", srcDateTime,   
                "yyyy-MM-dd HH:mm:ss", dstTimeZoneId);   
    }  
    
}

發佈了33 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章