Проверка даты в Java точно так же, как Oracle в TO_DATE()

Я должен проверить дату в Java, чтобы проверить, находится ли она в правильном формате и правильном значении.

Если я использую класс SimpleDateformat, он также сделает неправильную дату действительной, потому что, если месяц указан как 14, он добавит 1 год к части года.

Однако в Oracle он будет индивидуально проверять правильность месяца, даты, часа, минуты и т. д.

Например. в оракуле

TO_DATE(20141511 , 'YYYYMMDD') 

выдаст ошибку, что МЕСЯЦ, т.е. 15, неверен

Но на Яве

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

будет действительным, потому что он будет считать его как 2015+3 месяца.

Итак, как я могу проверить дату в Java точно так же, как это делает Oracle в своей функции TO_DATE?


person Noman K    schedule 22.07.2014    source источник


Ответы (2)


Если я понимаю ваш вопрос, вы можете использовать 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"
person Elliott Frisch    schedule 22.07.2014

Ни одно из этих решений не учитывает настройки 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;
  }
person Christopher Leuer    schedule 26.04.2016