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点minute分second秒
   * 2005年11月25日 22点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(
"获取时间变量的值出错了.");
      
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(
"没有年, 使用当前的年为缺省值.");
        timeElementValue[
0= Calendar.getInstance().get(Calendar.YEAR);
      }


     
//目前禁止年份是非4位数字表示的
      String tmpStr = timeElementValue[0]+"";
     
if(tmpStr.length()<4)
     
{
        System.out.println(
"目前禁止年份是非4位数字表示的,因为我们无法确定到底是哪一年");
        
return null;
     }



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

    
else
    
{
      System.out.println(
"时间变量获取失败,至少必须又2个时间变量. year,month,day 必须都有, 可以允许year没有使用当前年份");
      whatTime 
= null;
    }

    
return whatTime;
  }



  
/**
   * 把时间变量的值按顺序取出,以逗号隔开
   * 
@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(","); //以逗号隔开的数组.
  }


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


  
/**year, month, day, hour, minute,second, millisecond
      年    月     日    时   分     秒      毫秒
     这里暂时假设年份都是显示4位数字,月分和天数都是显示不带前置0的形式,
     如1998年9月3日,就不显示为98年09月03日,等日后完善。
     如果有显示年必须指定年要显示多少位。
     假设当前时间是:2002-11-15 20:13:55.359
     用户设置: year年month月day日hour时minute分second秒
     输出:2002年11月15日 20时13分55秒
     用户设置: year年month月day日
     输出:2002年11月15日
   注意必须用小写的形式,大写的不行,因为用户可能在时间字符串内
   也有大小写有区别的其他单词.
   *
*/


  
/**
     如果正确 就返回其出现的位置,如果错误就返回-1.
   
*/


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


    
//应经包含了一次。
    int nextfrom = firstIndex + element.length();

    
//已经到了尽头, 不用再找了。
    if (nextfrom >= timeStr.length())
    
{
      
return firstIndex; //element occurs only once in timeStr.
    }


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


    
if (secondIndex > 0//包含2次以上。
    {
      System.out.println(
"日期的格式设置有误!" + element + "" + timeStr +
                         
"中出现了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 鱼上游 阅读(2700) 评论(4)  编辑  收藏 所属分类: 爪哇世界探险


FeedBack:
# re: 格式化任意的时间格式
2005-11-28 22:04 | pikachu
为什么不用DateFormat ?  回复  更多评论
  
# re: 格式化任意的时间格式
2005-11-29 09:33 | 胡子鱼
DateFormat格式有限,比如: yyyy-mm-dd ,中间只能是相同的“-”,而我这个任意是指:
1)中间你可以用 “----”,或者“年年”什么的,只要非数字的都可以,而且长度不限。
2)这里也可以把 年 月 日 时 分 秒 微秒 的位置任意打乱。

这个功能主要是根据需求做出来的。  回复  更多评论
  
# re: 格式化任意的时间格式
2005-12-15 08:55 | boss_ch
不幸的说,上述要求 ,DataFormat 都是可以做到的  回复  更多评论
  
# re: 格式化任意的时间格式
2005-12-15 10:07 | 胡子鱼
楼上的朋友,你真的看清楚需求了吗?
SimpleDateFormat有类似的,
但也要经过处理才能用。

比如,用
SimpleDateFormat dateFormat = new SimpleDateFormat(strPattern);
dateFormat.applyPattern(strPattern);
date = dateFormat.parse(strDate);
也得先处理一下strDate。
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(82)

随笔分类(59)

文章分类(21)

相册

收藏夹(40)

GoodSites

搜索

  •  

积分与排名

  • 积分 - 1265756
  • 排名 - 22

最新评论

阅读排行榜