1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.commons.validator;
23
24 import java.text.DateFormat;
25 import java.text.ParseException;
26 import java.text.SimpleDateFormat;
27 import java.util.Locale;
28
29 /***
30 * <p>Perform date validations.</p>
31 * <p>
32 * This class is a Singleton; you can retrieve the instance via the
33 * getInstance() method.
34 * </p>
35 *
36 * @since Validator 1.1
37 */
38 public class DateValidator {
39
40 /***
41 * Singleton instance of this class.
42 */
43 private static final DateValidator instance = new DateValidator();
44
45 /***
46 * Returns the Singleton instance of this validator.
47 */
48 public static DateValidator getInstance() {
49 return instance;
50 }
51
52 /***
53 * Protected constructor for subclasses to use.
54 */
55 protected DateValidator() {
56 super();
57 }
58
59 /***
60 * <p>Checks if the field is a valid date. The pattern is used with
61 * <code>java.text.SimpleDateFormat</code>. If strict is true, then the
62 * length will be checked so '2/12/1999' will not pass validation with
63 * the format 'MM/dd/yyyy' because the month isn't two digits.
64 * The setLenient method is set to <code>false</code> for all.</p>
65 *
66 * @param value The value validation is being performed on.
67 * @param datePattern The pattern passed to <code>SimpleDateFormat</code>.
68 * @param strict Whether or not to have an exact match of the datePattern.
69 */
70 public boolean isValid(String value, String datePattern, boolean strict) {
71
72 if (value == null
73 || datePattern == null
74 || datePattern.length() <= 0) {
75
76 return false;
77 }
78
79 SimpleDateFormat formatter = new SimpleDateFormat(datePattern);
80 formatter.setLenient(false);
81
82 try {
83 formatter.parse(value);
84 } catch(ParseException e) {
85 return false;
86 }
87
88 if (strict && (datePattern.length() != value.length())) {
89 return false;
90 }
91
92 return true;
93 }
94
95 /***
96 * <p>Checks if the field is a valid date. The <code>Locale</code> is
97 * used with <code>java.text.DateFormat</code>. The setLenient method
98 * is set to <code>false</code> for all.</p>
99 *
100 * @param value The value validation is being performed on.
101 * @param locale The locale to use for the date format, defaults to the default
102 * system default if null.
103 */
104 public boolean isValid(String value, Locale locale) {
105
106 if (value == null) {
107 return false;
108 }
109
110 DateFormat formatter = null;
111 if (locale != null) {
112 formatter = DateFormat.getDateInstance(DateFormat.SHORT, locale);
113 } else {
114 formatter =
115 DateFormat.getDateInstance(
116 DateFormat.SHORT,
117 Locale.getDefault());
118 }
119
120 formatter.setLenient(false);
121
122 try {
123 formatter.parse(value);
124 } catch(ParseException e) {
125 return false;
126 }
127
128 return true;
129 }
130
131 }