【问题标题】:My date drives me crazy (Java)我的约会让我发疯(Java)
【发布时间】:2013-09-28 20:00:35
【问题描述】:

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

我使用"MMM. dd yyyy" 来解析像"Dec. 30 2011" 这样的字符串,带有3 个月的字符和一个点。

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

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

发生了什么事?

【问题讨论】:

  • design-patterns 标签用于特殊用途?

标签: java date datetime simpledateformat


【解决方案1】:

试试这个模式 -

嗯'。' dd yyyy

代码-

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

希望它会帮助你取笑:)

【讨论】:

  • 谢谢!我试过了,但没有快乐。问题在于“2011 年 9 月 30 日”
  • @user2720403 尝试使用'MMMM'
  • Sept. 30 2011 不是日期字符串的正确表示,我认为字符串应该是Sep. 30 2011
  • 所以我必须用 Sep. 替换 Sept. 吗?我试过MMMM,它不起作用。 MMMM. 也没有,带有训练点。
  • -1 这完全没有帮助。这是不可能的。它只会解析“2013 年 9 月 11 日”
【解决方案2】:

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

【讨论】:

  • 同意,这是更好的方法。
  • 同意,但在解析英文月份名称时不要忘记指定英文语言环境,否则在不同的默认语言环境下运行时会出错。
【解决方案3】:

我认为容错日期解析没有开箱即用的解决方案。 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;
}

【讨论】:

    【解决方案4】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 2012-11-02
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多