我有一个包含以下数据的平面文件
2/12/2016
2/3/2017
12/23/2017
04/23/2017
第一个是 M/dd/yyyy,第二个是 M/d/yyyy,其余日期格式为 MM/dd/yyyy。我正在使用以下函数来检查上述数据文件的数据有效性。
public static boolean isValidDateFormat(String format, String value)
{
boolean Retval = false;
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat(format);
date = sdf.parse(value);
if (value.equals(sdf.format(date))) {
Retval= true;
}
return Retval;
}
我必须在循环内检查日期有效性,并且只能传递一种日期格式,例如 isValidDateFormat("MM/dd/yyyy", "2/12/2016")
。上面的函数返回 前两个值的 false
和 其余值的 true
。
我想编写一个通用函数,其中对于这些有效的日期格式 MM/dd/yyyy、M/dd/yyyy 或 M/d/yyyy,函数返回 true。
最佳答案
使用 java.time
API,您的方法可以重写为这个
public static boolean isValidDateFormat(String value){
try {
LocalDate.parse(value, DateTimeFormatter.ofPattern("M/d/uuuu").withResolverStyle(ResolverStyle.STRICT));
} catch (DateTimeParseException e) {
return false;
}
return true;
}
这将为 MM/dd/yyyy、M/dd/yyyy、MM/d/yyyy、M/d/yyyy 返回 true
。
我们需要在这里明确指定 ResolveStyle。 Java 默认使用 ResolverStyle.SMART
。这允许您为每个月输入 1 - 31 范围内的天数,Java 会将无效天数(例如 2 月 30 日)转换为该月的最后一个有效天数。
我们在这里不需要那种“智能”行为,因此需要 ResolverStyle.STRICT
。
这不是那么简洁或简短,但效果也不错:
public static boolean isValidDateFormat(String value){
String[] sa = value.split("/");
if (sa[2].length() != 4) return false;
try {
LocalDate.of(Integer.parseInt(sa[2]), Integer.parseInt(sa[0]), Integer.parseInt(sa[1]));
} catch (DateTimeException e) {
return false;
}
return true;
}
关于java - 我想编写一个通用函数,其中对于这些有效的日期格式 MM/dd/yyyy、M/dd/yyyy 或 M/d/yyyy,函数返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43614449/