【问题标题】:Validating a Date in Java exactly like Oracle does in TO_DATE()在 Java 中验证日期,就像 Oracle 在 TO_DATE() 中所做的那样
【发布时间】:2014-07-22 01:50:48
【问题描述】:

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

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

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

例如在甲骨文中

TO_DATE(20141511 , 'YYYYMMDD') 

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

但是在 Java 中

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

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

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

【问题讨论】:

    标签: java oracle-sqldeveloper to-date


    【解决方案1】:

    如果我理解您的问题,您可以使用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"
    

    【讨论】:

      【解决方案2】:

      这些解决方案都没有考虑到日期格式的 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;
        }
      

      【讨论】:

        猜你喜欢
        • 2013-04-04
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        • 2012-08-12
        • 2016-09-12
        相关资源
        最近更新 更多