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 如何防止FastDateFormat模式;yyyy-MM-dd“;从解析格式为“的字符串”;“年月日”;_Java_Date - Fatal编程技术网

Java 如何防止FastDateFormat模式;yyyy-MM-dd“;从解析格式为“的字符串”;“年月日”;

Java 如何防止FastDateFormat模式;yyyy-MM-dd“;从解析格式为“的字符串”;“年月日”;,java,date,Java,Date,我有两个用于日期解析的格式字符串:“yyyy-MM-dd”和“dd-MM-yyyy”,我希望FastDateFormat类能够区分这两个字符串,以便一个可以通过ParseException,另一个可以工作。但是,这两种格式解析相同的字符串值,其中一种显然解析正确,而另一种则不正确 我的测试代码显示: Parsed: "2014-06-06" into Fri Jun 06 00:00:00 EDT 2014 using "yyyy-MM-dd" Parsed: "2014-06-06" into

我有两个用于日期解析的格式字符串:“yyyy-MM-dd”和“dd-MM-yyyy”,我希望FastDateFormat类能够区分这两个字符串,以便一个可以通过ParseException,另一个可以工作。但是,这两种格式解析相同的字符串值,其中一种显然解析正确,而另一种则不正确

我的测试代码显示:

Parsed: "2014-06-06" into Fri Jun 06 00:00:00 EDT 2014 using "yyyy-MM-dd"
Parsed: "2014-06-06" into Sat Dec 05 00:00:00 EST 11 using "dd-MM-yyyy"
Parsed: "06-06-2014" into Sat Dec 05 00:00:00 EST 11 using "yyyy-MM-dd"
Parsed: "06-06-2014" into Fri Jun 06 00:00:00 EDT 2014 using "dd-MM-yyyy"
有没有简单的方法让FastDateFormat根据模式正确处理4位数的年份?”
我在FastDateFormat上看不到任何宽松的设置。

我可以用复制您的结果。API似乎没有提供任何官方解决方案,也没有在最新版本v3.3.2中提供。通常,一个好的解析器会通过抛出异常来拒绝模式dd MM yyyy的输入2014-06-06,但这里
FastDateFormat
允许它,并且甚至不能设置为非宽松模式,如
SimpleDateFormat

因此,剩下的唯一选择是:

a) 自己动手操作(类似于下面的代码示例):

模式yyyy-MM-dd防止dd-MM-yyyy的情况非常相似

b) 或者更改日期时间库,因为至少有三个更好的库用于日期时间处理和格式化。请记住,apache库仍然基于旧的
java.util.*
-和
java.text.*
-包


我还怀疑类
FastDateFormat
的性能是否真的比其他日期时间库的不变版本好得多,肯定不是更好。例如,我在apache库中看到了一些同步关键字(潜在的锁竞争,不太现代).

我的解决方案是格式化解析的
日期
,并将
字符串
与原始字符串进行比较。这比检查特定字符是否在特定位置更通用,但速度也较慢。它允许用户配置格式

private final FastDateFormat myDateFormat = FastDateFormat.getInstance("dd-MM-yyyy");

public Date parseDate(String dateString) throws ParseException {
   final Date parsedDate = myDateFormat.parse(dateString);
   if(dateString != timeRangeDateFormat.format(parsedDate)){
      throw new ParseException("Strict mode engaged", 0);
   }
}         

我想您还需要将这个问题附加到其他问题上。在
Java
中找不到它。您还建议什么“更好的库”,我会查看它们。谢谢。@AwkOmo两个最流行且分布最广的库是JSR-310(又称Java-8中的内置Java.time-package)还有Joda Time。我自己的库Time4J未知,但也提供了不可变的类型和格式化程序。这三个库都提供了比
FastDateFormat
多得多的格式化和解析配置选项,例如严格解析。祝你好运。
private final FastDateFormat myDateFormat = FastDateFormat.getInstance("dd-MM-yyyy");

public Date parseDate(String dateString) throws ParseException {
   final Date parsedDate = myDateFormat.parse(dateString);
   if(dateString != timeRangeDateFormat.format(parsedDate)){
      throw new ParseException("Strict mode engaged", 0);
   }
}