/*
* $Id: DateValidator.java 280974 2005-09-15 00:06:59Z niallp $
* $Rev: 280974 $
* $Date: 2005-09-15 01:06:59 +0100 (Thu, 15 Sep 2005) $
*
* ====================================================================
* Copyright 2001-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.validator;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
/**
* <p>
* Perform date validations.
* </p>
* <p>
* This class is a Singleton; you can retrieve the instance via the getInstance() method.
* </p>
*
* @since Validator 1.1
*/
public class DateValidator {
/**
* Singleton instance of this class.
*/
private static final DateValidator instance = new DateValidator();
/**
* Returns the Singleton instance of this validator.
*
* @return A singleton instance of the DateValidator.
*/
public static DateValidator getInstance() {
return instance;
}
/**
* Protected constructor for subclasses to use.
*/
protected DateValidator() {
super();
}
/**
* <p>
* Checks if the field is a valid date. The pattern is used with <code>java.text.SimpleDateFormat</code>. If strict
* is true, then the length will be checked so '2/12/1999' will not pass validation with the format 'MM/dd/yyyy'
* because the month isn't two digits. The setLenient method is set to <code>false</code> for all.
* </p>
*
* @param value The value validation is being performed on.
* @param datePattern The pattern passed to <code>SimpleDateFormat</code>.
* @param strict Whether or not to have an exact match of the datePattern.
* @return true if the date is valid.
*/
public boolean isValid(String value, String datePattern, boolean strict) {
if (value == null
|| datePattern == null
|| datePattern.length() <= 0) {
return false;
}
SimpleDateFormat formatter = new SimpleDateFormat(datePattern);
formatter.setLenient(false);
try {
formatter.parse(value);
} catch (ParseException e) {
return false;
}
if (strict && (datePattern.length() != value.length())) {
return false;
}
return true;
}
/**
* <p>
* Checks if the field is a valid date. The <code>Locale</code> is used with <code>java.text.DateFormat</code>. The
* setLenient method is set to <code>false</code> for all.
* </p>
*
* @param value The value validation is being performed on.
* @param locale The locale to use for the date format, defaults to the default
* system default if null.
* @return true if the date is valid.
*/
public boolean isValid(String value, Locale locale) {
if (value == null) {
return false;
}
DateFormat formatter = null;
if (locale != null) {
formatter = DateFormat.getDateInstance(DateFormat.SHORT, locale);
} else {
formatter =
DateFormat.getDateInstance(
DateFormat.SHORT,
Locale.getDefault());
}
formatter.setLenient(false);
try {
formatter.parse(value);
} catch (ParseException e) {
return false;
}
return true;
}
}