開花流水

          空山無人,水流花開。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            79 Posts :: 42 Stories :: 160 Comments :: 0 Trackbacks

          package com.hanyastar.ws.service.ITalkBBService;

          import java.text.ParseException;
          import java.text.SimpleDateFormat;
          import java.util.Date;
          import java.util.GregorianCalendar;
          import java.util.TimeZone;
          import java.util.Vector;
              
          /**   
           * 與日期、時(shí)間相關(guān)的一些常用工具方法.   
           * <p>   
           * 日期(時(shí)間)的常用格式(formater)主要有: <br>   
           * yyyy-MM-dd HH:mm:ss <br>   
           *    
           * @author stephen   
           * @version 1.0.0   
           */    
          public final class DateTool {     
              
              /**   
               * 對(duì)日期(時(shí)間)中的日進(jìn)行加減計(jì)算. <br>   
               * 例子: <br>   
               * 如果Date類型的d為 2005年8月20日,那么 <br>   
               * calculateByDate(d,-10)的值為2005年8月10日 <br>   
               * 而calculateByDate(d,+10)的值為2005年8月30日 <br>   
               *    
               * @param d   
               *            日期(時(shí)間).   
               * @param amount   
               *            加減計(jì)算的幅度.+n=加n天;-n=減n天.   
               * @return 計(jì)算后的日期(時(shí)間).   
               */    
              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);     
              }     
              
              /**   
               * 對(duì)日期(時(shí)間)中由field參數(shù)指定的日期成員進(jìn)行加減計(jì)算. <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   
               *            日期(時(shí)間).   
               * @param field   
               *            日期成員. <br>   
               *            日期成員主要有: <br>   
               *            年:GregorianCalendar.YEAR <br>   
               *            月:GregorianCalendar.MONTH <br>   
               *            日:GregorianCalendar.DATE <br>   
               *            時(shí):GregorianCalendar.HOUR <br>   
               *            分:GregorianCalendar.MINUTE <br>   
               *            秒:GregorianCalendar.SECOND <br>   
               *            毫秒:GregorianCalendar.MILLISECOND <br>   
               * @param amount   
               *            加減計(jì)算的幅度.+n=加n個(gè)由參數(shù)field指定的日期成員值;-n=減n個(gè)由參數(shù)field代表的日期成員值.   
               * @return 計(jì)算后的日期(時(shí)間).   
               */    
              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();     
              }     
              
              /**   
               * 日期(時(shí)間)轉(zhuǎn)化為字符串.   
               *    
               * @param formater   
               *            日期或時(shí)間的格式.   
               * @param aDate   
               *            java.util.Date類的實(shí)例.   
               * @return 日期轉(zhuǎn)化后的字符串.   
               */    
              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);     
              }     
              
              /**   
               * 當(dāng)前日期(時(shí)間)轉(zhuǎn)化為字符串.   
               *    
               * @param formater   
               *            日期或時(shí)間的格式.   
               * @return 日期轉(zhuǎn)化后的字符串.   
               */    
              public static String date2String(String formater) {     
                  return date2String(formater, new Date());     
              }     
                   
              /**   
               * 獲取當(dāng)前日期對(duì)應(yīng)的星期數(shù).   
               * <br>1=星期天,2=星期一,3=星期二,4=星期三,5=星期四,6=星期五,7=星期六   
               * @return 當(dāng)前日期對(duì)應(yīng)的星期數(shù)   
               */    
              public static int dayOfWeek() {     
                  GregorianCalendar g = new GregorianCalendar();     
                  int ret = g.get(java.util.Calendar.DAY_OF_WEEK);     
                  g = null;     
                  return ret;     
              }     
              
              
              /**   
               * 獲取所有的時(shí)區(qū)編號(hào). <br>   
               * 排序規(guī)則:按照ASCII字符的正序進(jìn)行排序. <br>   
               * 排序時(shí)候忽略字符大小寫.   
               *    
               * @return 所有的時(shí)區(qū)編號(hào)(時(shí)區(qū)編號(hào)已經(jīng)按照字符[忽略大小寫]排序).   
               */    
              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;     
              }     
                
              /**   
               * 將日期時(shí)間字符串根據(jù)轉(zhuǎn)換為指定時(shí)區(qū)的日期時(shí)間.   
               *    
               * @param srcFormater   
               *            待轉(zhuǎn)化的日期時(shí)間的格式.   
               * @param srcDateTime   
               *            待轉(zhuǎn)化的日期時(shí)間.   
               * @param dstFormater   
               *            目標(biāo)的日期時(shí)間的格式.   
               * @param dstTimeZoneId   
               *            目標(biāo)的時(shí)區(qū)編號(hào).   
               *    
               * @return 轉(zhuǎn)化后的日期時(shí)間.   
               */    
              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) {     
                      //Log.output(e.toString(), Log);     
                      return null;     
                  } finally {     
                      sdf = null;     
                  }     
              }     
              
              /**   
               * 獲取系統(tǒng)當(dāng)前默認(rèn)時(shí)區(qū)與UTC的時(shí)間差.(單位:毫秒)   
               *    
               * @return 系統(tǒng)當(dāng)前默認(rèn)時(shí)區(qū)與UTC的時(shí)間差.(單位:毫秒)   
               */    
              private static int getDefaultTimeZoneRawOffset() {     
                  return TimeZone.getDefault().getRawOffset();     
              }     
              
              /**   
               * 獲取指定時(shí)區(qū)與UTC的時(shí)間差.(單位:毫秒)   
               *    
               * @param timeZoneId   
               *            時(shí)區(qū)Id   
               * @return 指定時(shí)區(qū)與UTC的時(shí)間差.(單位:毫秒)   
               */    
              private static int getTimeZoneRawOffset(String timeZoneId) {     
                  return TimeZone.getTimeZone(timeZoneId).getRawOffset();     
              }     
              
              /**   
               * 獲取系統(tǒng)當(dāng)前默認(rèn)時(shí)區(qū)與指定時(shí)區(qū)的時(shí)間差.(單位:毫秒)   
               *    
               * @param timeZoneId   
               *            時(shí)區(qū)Id   
               * @return 系統(tǒng)當(dāng)前默認(rèn)時(shí)區(qū)與指定時(shí)區(qū)的時(shí)間差.(單位:毫秒)   
               */    
              private static int getDiffTimeZoneRawOffset(String timeZoneId) {     
                  return TimeZone.getDefault().getRawOffset()     
                          - TimeZone.getTimeZone(timeZoneId).getRawOffset();     
              }     
              
              /**   
               * 將日期時(shí)間字符串根據(jù)轉(zhuǎn)換為指定時(shí)區(qū)的日期時(shí)間.   
               *    
               * @param srcDateTime   
               *            待轉(zhuǎn)化的日期時(shí)間.   
               * @param dstTimeZoneId   
               *            目標(biāo)的時(shí)區(qū)編號(hào).   
               *    
               * @return 轉(zhuǎn)化后的日期時(shí)間.   
               * @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);     
              }     
              
                
              /**   
               * 測(cè)試的main方法.   
               *    
               * @param argc   
               */    
              public static void main(String[] argc){
                  String nowDateTime =date2String("yyyy-MM-dd HH:mm:ss");  
                    
                  System.out.println(string2TimezoneDefault(nowDateTime,"UTC"));  
                    
          //        String[] ids = fecthAllTimeZoneIds();     
          //        String nowDateTime =date2String("yyyy-MM-dd HH:mm:ss");     
          //        System.out.println("The time Asia/Shanhai is " + nowDateTime);//程序本地運(yùn)行所在時(shí)區(qū)為[Asia/Shanhai]     
          //        //顯示世界每個(gè)時(shí)區(qū)當(dāng)前的實(shí)際時(shí)間     
          //        for(int i=0;i <ids.length;i++){     
          //            System.out.println(" * " + ids[i] + "=" + string2TimezoneDefault(nowDateTime,ids[i]));      
          //        }     
          //        //顯示程序運(yùn)行所在地的時(shí)區(qū)     
          //        System.out.println("TimeZone.getDefault().getID()=" +TimeZone.getDefault().getID());     
              }  
                
          }  

          posted on 2010-03-26 15:28 開花流水 閱讀(376) 評(píng)論(1)  編輯  收藏 所屬分類: java

          Feedback

          # re: 與日期、時(shí)間相關(guān)的一些常用工具方法. 2011-10-09 18:23 開花流水
          計(jì)算兩個(gè)日期時(shí)間差實(shí)例代碼:


          public static void main(String[] args) throws ParseException{

          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Date currentTime=new Date();
          //將截取到的時(shí)間字符串轉(zhuǎn)化為時(shí)間格式的字符串
          Date beginTime=sdf.parse("2010-07-27 12:53:30");
          //默認(rèn)為毫秒,除以1000是為了轉(zhuǎn)換成秒
          long interval=(currentTime.getTime()-beginTime.getTime())/1000;//秒
          long day=interval/(24*3600);//天
          long hour=interval%(24*3600)/3600;//小時(shí)
          long minute=interval%3600/60;//分鐘
          long second=interval%60;//秒
          System.out.println("兩個(gè)時(shí)間相差:"+day+"天"+hour+"小時(shí)"+minute+"分"+second+"秒");

          }


          可以把數(shù)據(jù)庫(kù)的日期時(shí)間轉(zhuǎn)換成毫秒數(shù),然后計(jì)算間隔時(shí)間差,如果只想計(jì)算出兩個(gè)時(shí)間相差幾天可以:間隔秒數(shù)/60*60*24。
          注意:數(shù)據(jù)庫(kù)中或提供的日期時(shí)間格式一定要與SimpleDateFormat("yyyy-MM-dd HH:mm:ss")中的日期格式一致,不然會(huì)出錯(cuò)的。

            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 富裕县| 丰县| 昂仁县| 竹北市| 柞水县| 徐水县| 新绛县| 建始县| 杭州市| 河源市| 黄大仙区| 无锡市| 萨嘎县| 临夏市| 禄劝| 牡丹江市| 平原县| 鄢陵县| 洞头县| 淮滨县| 永丰县| 榆社县| 吐鲁番市| 邻水| 启东市| 东丽区| 廉江市| 东乌珠穆沁旗| 南投市| 万盛区| 启东市| 班玛县| 仙游县| 庆阳市| 沽源县| 庆云县| 栾川县| 石屏县| 南木林县| 凉城县| 永定县|