使用 apache lang DateUtil 的日期格式失败
date format using apache lang DateUtil fails
我正在尝试使用 DateUtils
将字符串格式的日期转换为日期。以下是我预期的日期格式,
private static final String[] EXPECTED_DATE_FORMAT = {"yyyy-MM-dd","dd-MM-yyyy","dd-MMM-yyyy",};
并且我运行针对以下值进行测试,
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("2019-05-18", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-05-2019", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-May-2019", EXPECTED_DATE_FORMAT));
我得到以下结果,
Sat May 18 00:00:00 IST 2019
Tue Nov 09 00:00:00 IST 23
Sat May 18 00:00:00 IST 2019
为什么第二个值“18-05-2019
”与格式“dd-MM-yyyy
”不匹配而得到相同的结果?
我应该同时支持 dd-MM-yyyy
和 yyyy-MM-dd
的哪些更改?
您应该改用 DateUtils#parseDateStrictly 方法
这是因为 DateUtils.parseDate
在内部使用 SimpleDateFormat
和 "lenient parsing" (SimpleDateFormat.setLenient(true)
)。宽松的解析粗略地说,如果字符串与模式不完全匹配,解析器会尝试 "guess" 启发式地解释您的字符串以获得一些有意义的日期。
在您的示例中,第二个字符串失败,因为第一个模式被认为 "good enough" 被使用,然后解析器将事情搞砸了。
您可以使用 DateUtils.parseDateStrictly
禁用宽大处理。
我正在尝试使用 DateUtils
将字符串格式的日期转换为日期。以下是我预期的日期格式,
private static final String[] EXPECTED_DATE_FORMAT = {"yyyy-MM-dd","dd-MM-yyyy","dd-MMM-yyyy",};
并且我运行针对以下值进行测试,
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("2019-05-18", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-05-2019", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-May-2019", EXPECTED_DATE_FORMAT));
我得到以下结果,
Sat May 18 00:00:00 IST 2019
Tue Nov 09 00:00:00 IST 23
Sat May 18 00:00:00 IST 2019
为什么第二个值“18-05-2019
”与格式“dd-MM-yyyy
”不匹配而得到相同的结果?
我应该同时支持 dd-MM-yyyy
和 yyyy-MM-dd
的哪些更改?
您应该改用 DateUtils#parseDateStrictly 方法
这是因为 DateUtils.parseDate
在内部使用 SimpleDateFormat
和 "lenient parsing" (SimpleDateFormat.setLenient(true)
)。宽松的解析粗略地说,如果字符串与模式不完全匹配,解析器会尝试 "guess" 启发式地解释您的字符串以获得一些有意义的日期。
在您的示例中,第二个字符串失败,因为第一个模式被认为 "good enough" 被使用,然后解析器将事情搞砸了。
您可以使用 DateUtils.parseDateStrictly
禁用宽大处理。