我需要使用SimpleDateFormat
将字符串转换为Date对象。
我使用"MMM. dd yyyy"
来解析"Dec. 30 2011"
之类的字符串,包含3个月的字符和一个点。
"May 30 2011"
失败,所以我必须抓住异常并重新尝试使用"MMM dd yyyy"
。它适用于“五月”,到目前为止如此丑陋但有效。
但是当它到达“2011年9月11日”时,以上所有加"MMMM. dd yyyy"
和"MMMM dd yyyy"
都会失败。所以我根本无法解析它。
发生了什么事?
答案 0 :(得分:4)
尝试这种模式 -
MMM '' dd yyyy
代码 -
DateFormat df = new SimpleDateFormat("MMM'.' dd yyyy");
Date date = df.parse("Dec. 30 2011");
希望它能帮助你取笑:)
答案 1 :(得分:4)
如果是我,而不是尝试不同的模式并依赖异常处理,我只需对前3个字母进行子串,追加最后7个字母,并用MMMdd yyyy
解析。
答案 2 :(得分:1)
我认为对于容忍日期解析没有开箱即用的解决方案。 JDK和常用的Joda Time库都不直接支持这一点。但编写一个尝试不同日期格式的助手方法应该相对容易,直到成功(或失败)为止。
private static final DateFormat[] FORMATS = new DateFormat[] {
new SimpleDateFormat("MM. dd yy"),
new SimpleDateFormat("MMM. dd yy"),
new SimpleDateFormat("MMM dd yy") };
public static synchronized Date parse(String dateString) throws ParseException {
ParseException e = null;
for(DateFormat format : FORMATS) try {
return format.parse(dateString);
} catch (ParseException ex) {
if (e == null || e.getErrorOffset() < ex.getErrorOffset()) e = ex;
}
throw e;
}
答案 3 :(得分:1)
Java只能解析3个字母的缩写(MMM
)或完整的月份名称(MMMM
)。
您必须将输入按到3个字母的缩写。最简单的方法是使用正则表达式。
在解析之前执行此行以清理它:
str = str.replaceAll("(?<=^...)\\w+\\.?", "");
这会从Sep 11 2011
放弃Sept. 11 2011
,但保持适当的输入不变。它还可以清除任何长度的缩写,无论是否有句号 - 它都是多功能的。
然后,您可以使用现有格式字符串解析它。