我的约会让我发疯(Java)

时间:2013-09-28 20:00:36

标签: java date datetime simpledateformat

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

我使用"MMM. dd yyyy"来解析"Dec. 30 2011"之类的字符串,包含3个月的字符和一个点。

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

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

发生了什么事?

4 个答案:

答案 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,但保持适当的输入不变。它还可以清除任何长度的缩写,无论是否有句号 - 它都是多功能的。

然后,您可以使用现有格式字符串解析它。