1

Javaで日付を検証して、正しい形式と正しい値であるかどうかを確認する必要があります。

SimpleDateformat クラスを使用すると、間違った日付も有効になります。月が 14 として指定されている場合、年の部分に 1 年が追加されるためです。

ただし、Oracle では、 Month 、 Date 、 Hour 、 Minute などが正しいかどうかを個別にチェックします。

たとえば、オラクルでは

TO_DATE(20141511 , 'YYYYMMDD') 

MONTH ie 15 が正しくないというエラーが表示されます

しかしジャバでは

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 に答える