目前公司有一需求,对账单中有“日期”这一列;可是对账单有多家银行的;每家银行的时间格式有可能不一样;比如平安银行是:yyyyMMdd,民生银行是yyyy-MM-dd,还有更恶心的dd/MM/yyyy;一共有上百家银行需要支持自动化识别;我目前没什么思路,想用SimpleDateFormat来parse,parse出exception了,就catch,下一个parrten再parse;可是parrten设置成yyyyMMdd也能parse掉yyyy-MM-dd;得到的时间还不一样,有点凌乱…………请大神帮忙想想解决方案!!  

解决方案 »

  1.   


    面向对象还用一大堆if/else的话就太痛苦了:
    public enum Bank{
    PINGAN("平安",new SimpleDateFormat("yyyyMMdd")),
    MINSHENG("民生",new SimpleDateFormat("yyyy-MM-dd")),
            ***** private String name;
    private SimpleDateFormat sdf;
    public Bank(String name,SimpleDateFormat sdf){
    this.name=name;
    this.sdf = sdf;
    }
    public SimpleDateFormat getDateFormat(){
    return this.sdf;
    }
    }
    这样你觉得会好点吗?
      

  2.   

    “可是parrten设置成yyyyMMdd也能parse掉yyyy-MM-dd”
    —— 咋可能长度都不一样的设置好pattern字符串数组,把各种串放进去;如果想再稍微高效点点,也可以考虑先按长度匹配。另外,其实我觉得按照银行类型来设置对照表其实从性能和可靠性上来说最靠谱。
      

  3.   


    可以试试哦,真的可以parsepublic static void main(String[] args) throws ParseException {
    String anyTime = "2012-01-01";
    SimpleDateFormat df = null;
    Date result = null;
    try{
    df = new SimpleDateFormat("yyyyMMdd");
    result = df.parse(anyTime);
    }catch (Exception e) {
    e.printStackTrace();
    }
    System.out.println(df.format(result));
    }直接run就行
      

  4.   


    力气活也行啊,实现这种需求是第一,以后再调优吧用一种pattern能parse两种date,这个事怎么解决呢。
      

  5.   

    我也想过形成一套标准,至少在导入数据的时候,让用户显式的定义一个pattern也可以可是不现实啊。
      

  6.   

    package com.luger.converter;import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;import ognl.DefaultTypeConverter;public class DateConverter extends DefaultTypeConverter  {
         private static final DateFormat[] ACCEPT_DATE_FORMATS = {
                    new SimpleDateFormat("dd/MM/yyyy"),
                    new SimpleDateFormat("yyyy-MM-dd"),
                    new SimpleDateFormat("yyyy/MM/dd") }; // 支持转换的日期格式     @Override
         public Object convertValue(Map context, Object value, Class toType) {
    System.out.println("date3");
               if (toType == Date.class) { // 浏览器向服务器提交时,进行String to Date的转换
                    Date date = null;
                    String dateString = null;
                    String[] params = (String[]) value;
                    dateString = params[0];// 获取日期的字符串
                    for (DateFormat format : ACCEPT_DATE_FORMATS) {
                         try {
                               return format.parse(dateString);// 遍历日期支持格式,进行转换
                         } catch (Exception e) {
                               continue;
                         }
                    }
                    return null;
               } else if (toType == String.class) { // 服务器向浏览器输出时,进行Date to String的类型转换
                    Date date = (Date) value;
                    return new SimpleDateFormat("yy-MM-dd").format(date);// 输出的格式是yyyy-MM-dd
               }
               return null;
         }
    }以前用到过的 自己改改应该可以
      

  7.   


    真没注意过这个问题,不过即便能解析,也只能得出错误结果,所以还是可以考虑优化下,做个最终的确认测试:public class DateParser {
        private DateFormat[] dfs = { new SimpleDateFormat("yyyyMMdd"), new SimpleDateFormat("dd/MM/yyyy"),
                new SimpleDateFormat("yyyy-MM-dd") };    public static void main(String[] args) throws Exception {
            DateParser parser = new DateParser();
            System.out.println(parser.parse("2012-01-01"));
            System.out.println(parser.parse("2012-13-32"));
        }    public Date parse(String date) {
            if (date != null) {
                for (DateFormat format : dfs) {
                    try {
                        Date result = format.parse(date);
                        if (date.equals(format.format(result))) { // 确认测试
                            return result;
                        }
                    } catch (ParseException ex) {
                        // Do nothing
                    }
                }
            }
            return null;
        }
    }
      

  8.   


    /**
     * 目前公司有一需求,对账单中有“日期”这一列; 可是对账单有多家银行的; 每家银行的时间格式有可能不一样;
     * 比如平安银行是:yyyyMMdd,民生银行是yyyy-MM-dd,还有更恶心的dd/MM/yyyy; 一共有上百家银行需要支持自动化识别;
     * 我目前没什么思路,
     * 想用SimpleDateFormat来parse,parse出exception了,就catch,下一个parrten再parse;
     * 可是parrten设置成yyyyMMdd也能parse掉yyyy-MM-dd; 得到的时间还不一样,有点凌乱………… 请大神帮忙想想解决方案!!
     * 
     * @param source
     */ private static Date checkDate(String source) throws Exception {
    if (source.length() == 8) {
    return parseDate(source, "yyyyMMdd");
    }
    Pattern p = Pattern.compile("\\D");
    Matcher m = p.matcher(source);
    String pattern = "";
    int index = -1;
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
    index = m.end();
    pattern = m.group();
    // 日期在前
    if (index == 3) {
    sb.append("dd").append(pattern);
    }
    if (index == 6) {
    sb.append("MM").append(pattern).append("yyyy");
    }
    // 年份在前
    if (index == 5) {
    sb.append("yyyy").append(pattern); }
    if (index == 8) {
    sb.append("MM").append(pattern).append("dd");
    }
    }
    return parseDate(source, sb.toString());
    } private static Date parseDate(String source, String pattern)
    throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    return sdf.parse(source);
    }
     这样看看有帮助没