2016-04-26 51 views
0

我有一个解析字符串到sql.date的问题 这段代码只在我的项目中第一次工作,它会正常解析日期,但第二次抛出例外。不可解析的日期异常:字符串到java.sql.date

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

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); 
} 
+1

请显示整个异常(不在注释中,通过编辑问题) –

+3

为什么要将字符串转换为java.util.Date,然后转换为java.sql.Date?您可以根据java.util.Date的时间值创建一个'java.sql.Date'。 –

+0

考虑在**字段**'dateFormat'上使用'applyPattern'时会发生什么:您正在更改'dateFormat',因此后续对'changeDate'的调用将失败。 –

回答

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); 
} 

因为最前一页执行过程中要修改的SimpleDateFormat的模式将无法解析第二次约会。

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

0

这是因为你改变了dateFormat的模式。 这将工作:

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); 
} 
0

很显然,这会为第一次运行工作,但不是第二。你的问题是你打电话applyPattern(),所以它只会预期在日期格式的新日期。

这是一个好一点的代码:

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); 
} 
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不是线程安全的:

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