23/12/2013是用MM / dd / yyyy格式映射的原因,为什么不用ParseException

有人可以帮忙吗?

public void dateCalender() throws ParseException{ System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("120/12/2013").toString()); //OUTPUT (Unexpected): Mon Dec 12 00:00:00 IST 2022 System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("23/12/2013").toString()); //OUTPUT (Unexpected): Wed Nov 12 00:00:00 IST 2014 System.out.println(new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse("Jan/12/2013").toString()); //OUTPUT (Expected): Unparseable date: "Jan/12/2013" } 

您必须使用false调用setLenient – 否则SimpleDateFormat将尝试“弄清楚”是哪个月。 因此,首先创建SimpleDateFormat并调用sdf.setLenient(false) 。 现在解析时,您将获得exception。

根据文档 ,解析是宽松的 ,所以你没有得到无效输入的exception。 它转换为另一个值。

默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的forms,但仍可以解析为日期,则解析成功。 客户可以通过调用setLenient(false)坚持严格遵守格式。


如果你想得到java.text.ParseException: Unparseable date: ,那么应用setLenient(false);SimpleDateFormat

  String dateStr="120/12/2013"; SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); sdf.setLenient(false); try { Date d=sdf.parse(dateStr); } catch (ParseException ex) { ex.printStackTrace(); } 

从文档 :

 public void setLenient(boolean lenient) 

您需要将格式设置为非宽松。

在前两个:

 MM/dd/yyyy 120/12/2013 

编译器将把它作为’12 / 12/2013 + 118个月’,并基本上解决正确的日期。 在你的例子中,它出现在2022年12月12日(2013年12月12日+ 9年)。

 MM/dd/yyyy 23/12/2013 

完全相同的事情发生了。 你得到’12 / 12/2013 + 9个月’,或2014年12月11日。

第三个在技术上不是MM / dd / yyyy格式。 从其他答案中,您可以执行以下操作:

 SystemDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); sdf.setLenient(true); sdf.parse("Jan/12/2013"); System.out.println(sdf.toString()); 

你使用的格式是MM / dd / yyyy。所以它采取两个位置

你试试这种方式:

System.out.println(new SimpleDateFormat(“MMM / dd / yyyy”,Locale.ENGLISH).parse(“Jan / 12/2013”​​)。toString());

这里不会抛出不可解决的例外情况,但我并不知道这是否有效

我认为每次只使用MM / dd / yyyy格式作为“1/12/2013”​​时这将是错误的方式