Unparsable date exception:字符串到java.sql.date

时间:2016-04-26 14:22:30

标签: java

我将字符串解析为sql.date时遇到问题 此代码仅在我的项目中第一次使用,它会正常解析日期,但第二次抛出异常。

我打印了函数收到的日期,格式相同,例如02.02.2016是okey,我只将月份更改为2016年4月2日,并引发了异常。

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy");
private final String sqldateFormat = "yyyy-mm-dd"; 

public java.sql.Date changeDate(String date) {      
    String newDate = "";
    try {
        java.util.Date d = dateFormat.parse(date);
        dateFormat.applyPattern(sqldateFormat);
        newDate = dateFormat.format(d);

    } catch (ParseException e) {
        e.printStackTrace();
    }                   

    return java.sql.Date.valueOf(newDate);
}

4 个答案:

答案 0 :(得分:2)

试试这个

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy");
private final SimpleDateFormat sqldateFormat = new SimpleDateFormat("yyyy-mm-dd");

public java.sql.Date changeDate(String date) {      
    String newDate = "";
    try {
        java.util.Date d = dateFormat.parse(date);
        newDate = sqldateFormat.format(d);
    } catch (ParseException e) {
        e.printStackTrace();
    }                   
    return java.sql.Date.valueOf(newDate);
}

因为在fisrt执行期间,您正在修改SimpleDateFormat的模式,但它无法解析第二个日期。

dateFormat.applyPattern(sqldateFormat);会将模式修改为"yyyy-mm-dd",然后解析02.04.2016会抛出异常。

答案 1 :(得分:0)

这是因为您更改了private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy"); private final SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-mm-dd"); public java.sql.Date changeDate(String date) { String newDate = ""; try { java.util.Date d = dateFormat.parse(date); newDate = sqlFormat.format(d); } catch (Exception e) { e.printStackTrace(); } return java.sql.Date.valueOf(newDate); } 的模式。 这将有效:

null

答案 2 :(得分:0)

显然,这适用于第一次运行,但不适用于第二次运行。你的问题是你打电话给applyPattern(),所以它只能期待sql日期格式的新日期。

这是一个更好的代码:

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy");
private final SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-mm-dd"); 

    public java.sql.Date changeDate(String date) {      

    String newDate = "";
    try {
        java.util.Date d = dateFormat.parse(date);
        newDate = sqlFormat.format(d);

    } catch (ParseException e) {
        e.printStackTrace();
    }                   

    return java.sql.Date.valueOf(newDate);
}

答案 3 :(得分:0)

请勿使用valueOf()

如果您有java.util.Date并想要java.sql.Date(或java.sql.Timestamp),请使用Date(long date)构造函数:

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

此外,捕获异常并继续执行而不处理它(打印它不处理它)。

意味着您的代码应该是:

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.mm.yyyy");

public java.sql.Date changeDate(String date) {
    try {
        return new java.sql.Date(dateFormat.parse(date).getTime());
    } catch (ParseException e) {
        throw new IllegalArgumentException("Invalid date: " + date);
    }
}

警告: SimpleDateFormat不是线程安全的:

  

日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。