我有两个格式字符串用于日期解析:"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"
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法让FastDateFormat根据模式正确处理4位数年份?"我没有在FastDateFormat上看到任何宽松的设置.
我可以使用Apache-Common-Lang-library重现您的结果。看来API没有提供任何官方解决方案,最新版本v3.3.2也没有提供。通常,一个好的解析器会通过抛出异常来拒绝模式 dd-MM-yyyy 的输入 2014-06-06,但这里FastDateFormat容忍它,甚至不能设置为非宽松模式,如SimpleDateFormat.
所以剩下的唯一选择是:
a)进行您自己的 hack(类似于以下代码示例):
public class ParserDDMMYYYY extends FastDateFormat {
public static final INSTANCE =
new ParserDDMMYYYY("dd-MM-yyyy", TimeZone.getDefault(), Locale.getDefault());
@Override
public Date parse(String input) throws ParseException {
if (input.charAt(4) == '-') {
throw new ParseException("Invalid format: " + input, 0);
}
return super.parse(input);
}
// ... more overrides of similar parse methods
}
Run Code Online (Sandbox Code Playgroud)
防止模式 yyyy-MM-dd 的 dd-MM-yyyy 的情况非常相似。
b)或者您更改日期时间库,因为至少有三个更好的库用于日期时间处理和格式化。请记住,apache 库仍然基于旧的java.util.*- 和java.text.*- 包。
我还怀疑该类的FastDateFormat性能是否真的好得多,与其他日期时间库的不可变版本相比肯定不会更好。例如,我在 apache 库中看到了一些同步关键字(潜在的锁竞争,不是那么现代)。