繁体   English   中英

在Java中验证日期与Oracle在TO_DATE()中完全相同

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM