Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormat未正确分析日期_Java_Date_Simpledateformat_Date Parsing - Fatal编程技术网

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