我将字符串解析为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);
}
答案 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
不是线程安全的:
日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。