/* * $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; } }