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”时这将是错误的方式