Java SimpleDataFormat模糊匹配

Java SimpleDataFormat模糊匹配,java,Java,我有密码: public List<Date> parse(String date) { // todo: for parsing List<Date> dateList = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.setLenient(true); for (String form

我有密码:

public List<Date> parse(String date) {
        // todo: for parsing
        List<Date> dateList = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat();
        sdf.setLenient(true);
        for (String format: DATE_FORMATS) {
            sdf = new SimpleDateFormat(format);
            try {
                Date dt = sdf.parse(date);
                System.out.println("Success! "+format);
                dateList.add(dt);
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                //System.err.println("failed!");
            }
        }
        return dateList;
    }
我得到的结果是:

Success! EEEE MMM dd hh:mm a z yyyy
Success! EEEE MMM yyyy hh:mm a z dd
为什么第二种模式与示例相匹配?任何启示都将受到高度赞赏


谢谢

新对象创建将覆盖下面的代码

sdf.setLenient(true);
修改属性后创建对象。(由于以下原因,行上方无效)

现在,“宽大”将再次具有默认值

而不是使用像bellow这样的方法来动态地将模式设置为sdf

sdf.applyPattern(arg0);

您使用的是宽松的日期格式,允许超出范围的日期元素。如果不希望允许超出范围的元素,请使用非宽松的日期格式

例如,此代码仅使用提供的一种日期格式进行解析:

  public List<Date> parse(String date) {
    // todo: for parsing
    List<Date> dateList = new ArrayList<>();
    for (String format: DATE_FORMATS) {
      SimpleDateFormat sdf = new SimpleDateFormat(format);
      sdf.setLenient(false);
      try {
        Date dt = sdf.parse(date);
        System.out.println("Success! "+format);
        dateList.add(dt);
      } catch (ParseException e) {
        // TODO Auto-generated catch block
        //System.err.println("failed!");
      }
    }
    return dateList;
  }
公共列表解析(字符串日期){
//todo:用于解析
List dateList=new ArrayList();
for(字符串格式:日期格式){
SimpleDataFormat sdf=新的SimpleDataFormat(格式);
sdf.setLenient(错误);
试一试{
日期dt=sdf.parse(日期);
System.out.println(“成功!”+格式);
添加日期列表(dt);
}捕获(解析异常){
//TODO自动生成的捕捉块
//System.err.println(“失败!”);
}
}
返回日期表;
}

我相信第二种格式正在解析提供的日期,即2012年8月29日的第2016天,当时处于宽松模式。

您能否提供日期格式的项目。您正在打印
日期格式
。将它添加到代码中,这样我们就可以看到它。另外值得注意的是,OP代码中的第一个
setLenient
无论如何都会被忽略,因为
sdf
在循环中被重新初始化,但这是非常没有意义的,因为a)它被忽略了,b)默认值无论如何都是
true
。@JasonC,是的,的确如此。
sdf.applyPattern(arg0);
  public List<Date> parse(String date) {
    // todo: for parsing
    List<Date> dateList = new ArrayList<>();
    for (String format: DATE_FORMATS) {
      SimpleDateFormat sdf = new SimpleDateFormat(format);
      sdf.setLenient(false);
      try {
        Date dt = sdf.parse(date);
        System.out.println("Success! "+format);
        dateList.add(dt);
      } catch (ParseException e) {
        // TODO Auto-generated catch block
        //System.err.println("failed!");
      }
    }
    return dateList;
  }