2

我需要使用将字符串转换为 Date 对象SimpleDateFormat

"MMM. dd yyyy"用来解析字符串,如"Dec. 30 2011", 3 个月的字符和一个点。

它失败了,"May 30 2011"所以我必须捕获异常并使用"MMM dd yyyy". 它适用于“五月”,到目前为止如此丑陋但有效。

但是当它到达“2011 年 9 月 11 日”时,以上所有的加"MMMM. dd yyyy""MMMM dd yyyy"失败。所以我根本无法解析它。

到底是怎么回事?

4

4 回答 4

4

如果是我,我不会尝试不同的模式并依赖异常处理,而是将前 3 个字母子串,附加最后 7 个字母,然后用MMMdd yyyy.

于 2013-09-28T20:30:20.847 回答
4

试试这个模式 -

嗯'。dd yyyy

代码 -

DateFormat df = new SimpleDateFormat("MMM'.' dd yyyy");
Date date = df.parse("Dec. 30 2011");

希望它会帮助你取笑:)

于 2013-09-28T20:02:49.190 回答
1

Java 只能解析 3 个字母的缩写 (as MMM) 或完整的月份名称 (as MMMM)。

您必须将您的输入按摩成 3 个字母的缩写。最简单的方法是使用正则表达式。

在解析之前执行此行以清理它:

str = str.replaceAll("(?<=^...)\\w+\\.?", "");

这将放弃你Sep 11 2011from Sept. 11 2011,但保持已经适当的输入不变。它还可以清除任何长度的缩写,无论是否带有句号 - 它是多功能的。

然后,您可以使用现有的格式字符串对其进行解析。

于 2013-09-28T20:37:17.290 回答
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;
}
于 2013-09-28T20:21:40.150 回答