[英]Validating a Date in Java exactly like Oracle does in TO_DATE()
我必须在Java中验证日期以检查它是否格式正确且值是否正确。
如果我使用SimpleDateformat Class,它也会使错误的日期有效,因为如果给出一个月为14,它将为Year部分添加1年。
但是在Oracle中,它会单独检查月,日,小时,分钟等是否正确。
例如在Oracle中
TO_DATE(20141511 , 'YYYYMMDD')
会给出MONTH即15错误的错误
但在Java中
Date d = "YYYYMMDD".parse("20141511");
将有效,因为它将计为2015 + 3个月。
那么,我如何在Java中验证日期,就像Oracle在其TO_DATE函数中所做的那样?
如果我理解你的问题,你可以使用DateFormat.setLenient(false)
。 根据JavaDoc,
指定日期/时间解析是否宽松...通过严格解析,输入必须与此对象的格式匹配。
DateFormat df = new SimpleDateFormat("yyyyMMdd");
df.setLenient(false);
try {
Date d = df.parse("20141511");
} catch (ParseException e) {
e.printStackTrace();
}
不允许无效日期解析和抛出
java.text.ParseException: Unparseable date: "20141511"
这些解决方案都不考虑日期格式的Oracle设置。 使用oracle.sql.Date和异常的更全局的解决方案:
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import oracle.sql.DATE;
public void validateDate (String dateString, String nlsDateFormat, String nlsDateLanguage) throws ParseException, SQLException {
if (dateString == null) {
throw new ParseException("Date parameter not entered.", 0);
} else {
try {
DATE.fromText(dateString, nlsDateFormat, nlsDateLanguage); //not implemented in every ojdbc driver, works with ojbdbc6.jar
} catch (SQLException e) {
if (!e.getMessage().contains("Unimplemented")) {
throw new SQLException (e);
}
}
}
}
(我发现一些驱动程序甚至无法处理这个..如果没有实现oracle.sql.DATE则绕过验证)/获取NLS_FORMAT和NLS_LANGUAGE的会话变量:
private String getDateNlsFmt()抛出SQLException {
String nlsDateFormat;
String sqlStmt =
"SELECT value nlsDateFormat "
+ " FROM nls_session_parameters "
+ " WHERE parameter = 'NLS_DATE_FORMAT' ";
QueryStatement q = new QueryStatement(conn, sqlStmt);
q.open();
if (!q.eof()) {
nlsDateFormat = q.getString("nlsDateFormat");
}
q.close();
return nlsDateFormat;
}
private String getDateNlsLang() throws SQLException {
String nlsDateLanguage;
String sqlStmt =
"SELECT value nlsDateLanguage "
+ " FROM nls_session_parameters "
+ " WHERE parameter = 'NLS_DATE_LANGUAGE' ";
QueryStatement q = new QueryStatement(conn, sqlStmt);
q.open();
if (!q.eof()) {
nlsDateLanguage = q.getString("nlsDateLanguage");
}
q.close();
return nlsDateLanguage;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.