SimpleDateFormat ParseException:无法解析的日期

时间:2013-03-03 09:20:52

标签: java

我正在尝试执行此代码:

Date date = null;
if (detailsBean.getDiscoveryProjectBean ().getCreatedDate ()==null || 
    detailsBean.getDiscoveryProjectBean ().getCreatedDate ().equalsIgnoreCase(""))
{
    projectDetails.getDiscoveryProject().setCreationTime(new Date());
}
else
{
    try 
    {
        date = new SimpleDateFormat (FormatUtils.simpleFormat).
            parse (detailsBean.getDiscoveryProjectBean ().getCreatedDate ());
    } catch (Exception e) {
        throw new PanDaApplicationException (e.getMessage ());
    }
    projectDetails.getDiscoveryProject().setCreationTime(date);
}
在try块中

抛出ParseException异常。我不知道原因,因为代码似乎很好。 FormatUtils.simpleFormat的定义为public static final String simpleFormat = "dd-MMM-yyyy"detailsBean.getDiscoveryProjectBean().getCreatedDate()的定义类似28-Feb-2013

我真的没有任何线索,为什么抛出这个异常,我需要帮助。

2 个答案:

答案 0 :(得分:4)

我的猜测是问题是SimpleDateFormat使用您的默认语言环境的方式 - 如果您的语言环境不使用“Feb”作为缩写的月份名称,那么您将遇到问题。因此,如果您的所有数据实际上都是英文,您可能需要:

DateFormat format = new SimpleDateFormat(FormatUtils.simpleFormat, Locale.US);
format.setTimeZone(...); // See below
date = format.parse(detailsBean.getDiscoveryProjectBean().getCreatedDate());

请注意有关设置时区的部分。同样,如果您未指定任何其他内容,SimpleDateFormat将使用您的系统默认值。 (您将获得“指定时区的午夜”作为Date值的瞬间。)

我还强烈建议您考虑使用Joda Time而不是内置的Date / Calendar类型 - 这是一个更好的日期/时间API。

答案 1 :(得分:3)

Locale.setDefault (Locale.ROOT);
System.out.println (new SimpleDateFormat ("dd-MMM-yyyy").parse ("28-Feb-2013"));
Locale.setDefault (Locale.forLanguageTag ("ru"));
System.out.println (new SimpleDateFormat ("dd-MMM-yyyy").parse ("28-Feb-2013"));

对我来说输出是:

Thu Feb 28 00:00:00 MSK 2013
Exception in thread "main" java.text.ParseException: Unparseable date: "28-Feb-2013"
    at java.text.DateFormat.parse(DateFormat.java:357)
    at DateFormat.main(DateFormat.java:19)

因此,使用ROOT语言环境成功解析了相同日期,但俄语失败了。