Java SimpleDataFormat未正确分析日期
我不明白为什么Java SimpleDataFormat未正确分析日期,java,date,simpledateformat,date-parsing,Java,Date,Simpledateformat,Date Parsing,我不明白为什么SimpleDateFormat不能正确解析以下输入数据 我试着在字符串上测试各种可能的允许日期格式,看看它是否能用其中一种格式正确解析 注意:我使用的其他不正确的日期格式报告解析错误。这就是我希望看到的 我做错了什么?或者,我可以做些什么作为解决办法 String dformat = "MM-dd-yyyy"; String cDate = "2013-12-28"; SimpleDateFormat f = new SimpleDateFormat(dformat); Date
SimpleDateFormat
不能正确解析以下输入数据
我试着在字符串
上测试各种可能的允许日期格式,看看它是否能用其中一种格式正确解析
注意:我使用的其他不正确的日期格式报告解析错误。这就是我希望看到的
我做错了什么?或者,我可以做些什么作为解决办法
String dformat = "MM-dd-yyyy";
String cDate = "2013-12-28";
SimpleDateFormat f = new SimpleDateFormat(dformat);
Date dd = f.parse(cDate);
结果就是成功。解析的日期为:
日期:太平洋标准时间195年9月12日星期五00:00:00
那么,日期应该是2013年12月28日。
在本例中,我希望看到(就像我看到的其他无效格式):
您的代码应该是这样的:
String dformat = "yyyy-MM-dd";
String cDate = "2013-12-28";
SimpleDateFormat f = new SimpleDateFormat(dformat);
Date dd = f.parse(cDate);
您的问题中的日期格式错误。数据格式不符合cDate格式。因此,您必须以数据格式提供cDate,或者必须以“yyyy-MM-dd”更改数据格式。您的格式模式和日期字符串不多。 改为:
String dformat = "yyyy-MM-dd";
你应该考虑使用java 8版本的java. Time.LoalDead和java. Time.LoalDATEFITE作为SDK的一部分。这些日期API被认为是更稳定的,因为你有问题。这里有一个例子。
String armisticeDate = "2013-12-28";
LocalDate aLD = LocalDate.parse(armisticeDate);
System.out.println("Date: " + aLD);
String armisticeDateTime = "2013-12-28T11:50";
LocalDateTime aLDT = LocalDateTime.parse(armisticeDateTime);
System.out.println("Date/Time: " + aLDT);
如果要创建不同的格式,可以执行以下操作
String anotherDate = "04 Apr 2016";
DateTimeFormatter df = DateTimeFormatter.ofPattern("dd MMM yyyy");
LocalDate random = LocalDate.parse(anotherDate, df);
System.out.println(anotherDate + " parses as " + random);
有关完整文档,请查看Oracle页面
要获取错误消息,请执行以下操作:
java.text.ParseException: Unparseable date: "2013-12-28"
您需要拨打:
f.setLenient(false);
正如的javadoc所说:
默认情况下,解析是宽松的:如果输入不是此对象的format方法使用的格式,但仍然可以作为日期进行解析,则解析成功。客户端可能会通过调用来坚持严格遵守格式
嗯,
SimpleDateFormat
被认为是a,带有
可能发生的情况与问题类似。考虑到您的模式和输入:
MM-dd-yyyy
2013-12-28
它可能把月份读作“20”,把天读作“3”,把年读作“-28”(或者其他一些值,因为我不知道它是如何把2-28
解释成4位数字的)。而这个混乱的最终结果是一个完全错误的、奇怪的日期——不要问我它是如何得到最终结果的,这对我来说是一个谜
无论如何,当模式与输入格式不匹配时,可能会发生这种情况,SimpleDateFormat
读取的实际值将是不可预测的,并且有点违反直觉。但真正重要的是,这个类有很多问题和设计缺陷,默认情况下是宽松的,因此它试图“聪明”并且在出错之前做了很多奇怪的事情
如果要验证输入,只需按照Andreas的建议调用f.setLenient(false)
关闭宽松模式。当输入与模式不匹配时,这将引发异常
但是如果您使用的是Java8,那么您应该使用,这是非常优越的,它解决了SimpleDataFormat
所面临的许多问题
若要检查字符串是否包含特定格式的日期,请使用。默认情况下,该类不能作为SimpleDataFormat
,因此它应按预期工作:
// use the format "month-day-year"
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM-dd-yyyy");
// try to parse a string in a different format (year-month-day)
LocalDate dt = LocalDate.parse("2013-12-28", fmt); // exception
上面的代码尝试创建一个LocalDate
,一个表示日期(仅限日、月和年)的类。但是如果您只想验证输入(不将其分配给任何变量),您可以使用格式化程序:
fmt.parse("2013-12-28"); // exception
您使用的是什么版本的java?我使用的是java 8。建议不要使用SimpleDataFormat吗?是的,这将正确解析它。但是日期格式最初是未知的,我想测试各种格式以找到正确的格式。在这里解析成功(尽管日期是错误的)。我希望它报告一个错误。首先,您可能需要调查在应用程序中可能找到的所有可能的日期格式。通过分析,构造一个算法来发现正确的格式。这是一项艰巨的任务,但并非不可能。到目前为止,所有答案都表示要更改日期格式以匹配字符串,但我正在尝试查找正确的日期格式我不知道其格式的字符串的ate格式。我希望解析函数报告错误,但它“成功”解析字符串。如果深入研究源代码,默认情况下,它会使用“不在乎位置到日期”字符串格式化日期。并相应地解析它。所以你只需要为它设置一个奇怪的字符串。如果您想动态生成格式,您需要自己准备字符串。目前为止,所有答案都是更改日期格式以匹配字符串,但我正在尝试为格式未知的字符串查找正确的日期格式。我希望parse函数报告错误,但它“成功”解析字符串。
fmt.parse("2013-12-28"); // exception