posts - 61,  comments - 2033,  trackbacks - 0

           


          import java.util.Calendar;
          import java.util.*;
          import java.sql.Timestamp;

          public class TimeFormat
          {
            
          private static String[] keywords =
                
          {
                
          "year""month""day""hour""minute""second""millisecond"}
          ;
            
          private String format;
            
          private Calendar whatTime;

            
          public TimeFormat()
            
          {
            }


            
          /**
             *
             * 
          @param format year-month-day hour:minute:second   2005-11-25 22:02
             * 
          @param timeStr
             * 
          @return
             *
             * year年month月day日 hour點(diǎn)minute分second秒
             * 2005年11月25日 22點(diǎn)22分15秒
             * 2005/11/25  22:22
             * 05/11/25 22:22
             
          */

            
          public static Calendar getTime(String format, String timeVarStr)
            
          {
              String timeFormatStr 
          = format;
              Calendar whatTime 
          = null;
              
          int year = 0, month = 0, day = 0, hour = 0, minute = 0,
                  second 
          = 0, millisecond = 0;

              String[] validTimeElements 
          =
                  
          {
                  
          "year""month""day""hour""minute""second""millisecond"}
          ;

              
          int dateVarCount = 0;
              
          int index = -1;

              Vector tmpV 
          = new Vector();

              Map map 
          = new HashMap();

              
          for (int i = 0; i < validTimeElements.length; i++)
              
          {
                 
          int pos = format.indexOf(validTimeElements[i]);
                 
          if(pos>=0)
                 
          {
                   map.put(
          new Integer(pos),validTimeElements[i]);
                 }

              }


              Object[] tmp 
          = map.keySet().toArray();
              Integer[] tmpInt 
          = new Integer[tmp.length];

              
          for(int i = 0; i<tmpInt.length;i++)
              
          {
                tmpInt[i] 
          = (Integer) tmp[i];
              }


              
          //從小到大排序, 還原原來的順序.
              Arrays.sort(tmpInt);
              String[] varNames  
          = new String[tmpInt.length];

              
          for(int i=0;i<varNames.length;i++)
              
          {
                varNames[i] 
          = (String) map.get(tmpInt[i]);
              }


              String[] varValue 
          = getTimeInOriginOrder(timeVarStr); //變量值

              
          if(varValue==null)
              
          {
                System.out.println(
          "獲取時(shí)間變量的值出錯(cuò)了.");
                
          return null;
              }


              
          int[] timeElementValue = new int[validTimeElements.length];

              
          for(int i=0;i<varNames.length;i++)
              
          {
                
          for(int j=0;j<validTimeElements.length;j++)
                
          {
                  
          if(varNames[i].equals(validTimeElements[j]))
                  
          {
                    timeElementValue[j] 
          = Integer.parseInt(varValue[i]);
                    
          break;
                  }

                }

              }


              
          if(format.indexOf("month")>=0 || format.indexOf("day")>=0)
              
          {
                
          if(format.indexOf("year")<0)
                
          {
                  System.out.println(
          "沒有年, 使用當(dāng)前的年為缺省值.");
                  timeElementValue[
          0= Calendar.getInstance().get(Calendar.YEAR);
                }


               
          //目前禁止年份是非4位數(shù)字表示的
                String tmpStr = timeElementValue[0]+"";
               
          if(tmpStr.length()<4)
               
          {
                  System.out.println(
          "目前禁止年份是非4位數(shù)字表示的,因?yàn)槲覀儫o法確定到底是哪一年");
                  
          return null;
               }



                whatTime 
          =  Calendar.getInstance();
                whatTime.set(timeElementValue[
          0], timeElementValue[1- 1,
                             timeElementValue[
          2], timeElementValue[3], timeElementValue[4],
                             timeElementValue[
          5]);
              }

              
          else
              
          {
                System.out.println(
          "時(shí)間變量獲取失敗,至少必須又2個(gè)時(shí)間變量. year,month,day 必須都有, 可以允許year沒有使用當(dāng)前年份");
                whatTime 
          = null;
              }

              
          return whatTime;
            }



            
          /**
             * 把時(shí)間變量的值按順序取出,以逗號隔開
             * 
          @param val
             * 
          @return
             
          */

            
          static private String[] getTimeInOriginOrder(String val)
            
          {
              String temp 
          = "";
              String digital 
          = "0123456789";
              
          for (int i = 0; i < val.length(); i++)
              
          {
                
          if (digital.indexOf(val.substring(i, i + 1)) > -1)
                
          {
                  temp 
          = temp + val.substring(i, i + 1);
                }

                
          else
                
          {
                  
          if (temp.length()>0 && temp.charAt(temp.length()-1)!=',' )
                  
          {
                    temp 
          = temp + ",";
                  }

                }

              }


              System.out.println(temp);
              
          return temp.split(","); //以逗號隔開的數(shù)組.
            }


            
          public Calendar getTime(String timeStr)
            
          {
              
          return getTime(format, timeStr);
            }


            
          /**year, month, day, hour, minute,second, millisecond
                年    月     日    時(shí)   分     秒      毫秒
               這里暫時(shí)假設(shè)年份都是顯示4位數(shù)字,月分和天數(shù)都是顯示不帶前置0的形式,
               如1998年9月3日,就不顯示為98年09月03日,等日后完善。
               如果有顯示年必須指定年要顯示多少位。
               假設(shè)當(dāng)前時(shí)間是:2002-11-15 20:13:55.359
               用戶設(shè)置: year年month月day日hour時(shí)minute分second秒
               輸出:2002年11月15日 20時(shí)13分55秒
               用戶設(shè)置: year年month月day日
               輸出:2002年11月15日
             注意必須用小寫的形式,大寫的不行,因?yàn)橛脩艨赡茉跁r(shí)間字符串內(nèi)
             也有大小寫有區(qū)別的其他單詞.
             *
          */


            
          /**
               如果正確 就返回其出現(xiàn)的位置,如果錯(cuò)誤就返回-1.
             
          */


            
          public static int isTimestampValid(String timeStr, String element)
            
          {
              
          //case1:不包含
              int firstIndex = timeStr.indexOf(element);
              
          if (firstIndex < 0)
              
          {
                
          return firstIndex;
              }


              
          //應(yīng)經(jīng)包含了一次。
              int nextfrom = firstIndex + element.length();

              
          //已經(jīng)到了盡頭, 不用再找了。
              if (nextfrom >= timeStr.length())
              
          {
                
          return firstIndex; //element occurs only once in timeStr.
              }


              
          int secondIndex = timeStr.indexOf(element, nextfrom);
              
          if (secondIndex < 0)
              
          {
                
          return firstIndex; //只出現(xiàn)一次
              }


              
          if (secondIndex > 0//包含2次以上。
              {
                System.out.println(
          "日期的格式設(shè)置有誤!" + element + "" + timeStr +
                                   
          "中出現(xiàn)了2次或2次以上,這樣無法分辨");
              }

              
          return -1;
            }


            
          public static void main(String[] args)
            
          {
              TimeFormat timeFormat1 
          = new TimeFormat();
              Calendar tmp 
          = getTime("year年month月day日""2005年1月5日");

              
          if(tmp!=null)
              
          {
                Timestamp whatTime 
          = new Timestamp(tmp.getTimeInMillis());
                System.out.println(whatTime);
              }

              
          else
              
          {
                System.out.println(
          "error found.");
              }

            }


          }
          posted on 2005-11-28 17:08 魚上游 閱讀(2704) 評論(4)  編輯  收藏 所屬分類: 爪哇世界探險(xiǎn)


          FeedBack:
          # re: 格式化任意的時(shí)間格式
          2005-11-28 22:04 | pikachu
          為什么不用DateFormat ?  回復(fù)  更多評論
            
          # re: 格式化任意的時(shí)間格式
          2005-11-29 09:33 | 胡子魚
          DateFormat格式有限,比如: yyyy-mm-dd ,中間只能是相同的“-”,而我這個(gè)任意是指:
          1)中間你可以用 “----”,或者“年年”什么的,只要非數(shù)字的都可以,而且長度不限。
          2)這里也可以把 年 月 日 時(shí) 分 秒 微秒 的位置任意打亂。

          這個(gè)功能主要是根據(jù)需求做出來的。  回復(fù)  更多評論
            
          # re: 格式化任意的時(shí)間格式
          2005-12-15 08:55 | boss_ch
          不幸的說,上述要求 ,DataFormat 都是可以做到的  回復(fù)  更多評論
            
          # re: 格式化任意的時(shí)間格式
          2005-12-15 10:07 | 胡子魚
          樓上的朋友,你真的看清楚需求了嗎?
          SimpleDateFormat有類似的,
          但也要經(jīng)過處理才能用。

          比如,用
          SimpleDateFormat dateFormat = new SimpleDateFormat(strPattern);
          dateFormat.applyPattern(strPattern);
          date = dateFormat.parse(strDate);
          也得先處理一下strDate。
            回復(fù)  更多評論
            
          <2005年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(82)

          隨筆分類(59)

          文章分類(21)

          相冊

          收藏夾(40)

          GoodSites

          搜索

          •  

          積分與排名

          • 積分 - 1267409
          • 排名 - 22

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 汶川县| 西丰县| 东安县| 安徽省| 芮城县| 岚皋县| 万全县| 巴林右旗| 南召县| 前郭尔| 会宁县| 房山区| 根河市| 安新县| 玉田县| 台江县| 苏州市| 房山区| 东方市| 涟水县| 曲松县| 慈溪市| 兴义市| 平陆县| 墨玉县| 普陀区| 乐昌市| 开远市| 信丰县| 西畴县| 定边县| 迭部县| 商都县| 徐汇区| 阿尔山市| 南岸区| 简阳市| 旺苍县| 揭西县| 上思县| 永吉县|