1

我必须在 Java 中验证日期以检查它的格式和值是否正确。

如果我使用 SimpleDateformat 类,它也会使错误的日期有效,因为如果一个月被指定为 14,它将在 Year 部分增加 1 年。

但是在 Oracle 中,它会单独检查 Month 、 Date 、 Hour 、 Minute 等是否正确。

例如在甲骨文中

TO_DATE(20141511 , 'YYYYMMDD') 

将给出错误,即 MONTH 即 15 不正确

但是在Java中

Date d = "YYYYMMDD".parse("20141511");

将有效,因为它将计为 2015+3 个月。

那么,如何像 Oracle 在其 TO_DATE 函数中一样验证 Java 中的日期呢?

4

2 回答 2

3

如果我理解您的问题,您可以使用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"
于 2014-07-22T01:57:54.540 回答
0

这些解决方案都没有考虑日期格式的 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 的会话变量:

私有字符串 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;
  }
于 2016-04-26T22:13:59.420 回答