1

我正在尝试执行此代码:

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.simpleFormatis的定义public static final String simpleFormat = "dd-MMM-yyyy"并且detailsBean.getDiscoveryProjectBean().getCreatedDate()具有类似的值28-Feb-2013

我真的不知道为什么会抛出这个异常,我需要帮助。

4

2 回答 2

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。

于 2013-03-03T09:26:46.873 回答
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语言环境解析,但用俄语失败。

于 2013-03-03T09:27:44.507 回答