我想检查输入的字符串是否为有效日期。
字符串像:-
"08-Nov-2011"
"21 Mar 2019"
java代码:-
boolean checkFormat;
String input = "08-Nov-2011";
if (input.matches("([0-9]{2})/([0-9]{2})/([0-9]{4})"))
checkFormat=true;
else
checkFormat=false;
System.out.println(checkFormat);
我正在考虑拆分,然后按其长度进行检查,例如第一个拆分词的长度为2,第二个拆分词的长度为3,最后一个单词的长度为4。
但是如果输入字符串像:-
AB-000-MN89
然后,它将失败。
请帮助我解决此问题。
答案 0 :(得分:3)
如几条评论所述,找出您的日期是否有效的最佳方法是尝试使用java.time.format.DateTimeFormatter
将其解析为类型为LocalDate
的日期对象。
您可以支持多种模式和/或使用DateTimeFormatter
类中的内置模式:
public static void main(String[] args) {
// provide some patterns to be supported (NOTE: there are also built-in patterns!)
List<String> supportedPatterns = new ArrayList<>();
supportedPatterns.add("dd.MMM.yyyy");
supportedPatterns.add("dd MMM yyyy");
supportedPatterns.add("dd-MMM-yyyy");
supportedPatterns.add("dd/MMM/yyyy");
supportedPatterns.add("ddMMMyyyy");
// define some test input
String input = "08-Nov-2011";
// provide a variable for each, pattern and the date
String patternThatWorked = null;
LocalDate output = null;
// try to parse the input with the supported patterns
for (String pattern : supportedPatterns) {
try {
output = LocalDate.parse(input, DateTimeFormatter.ofPattern(pattern));
// until it worked (the line above this comment did not throw an Exception)
patternThatWorked = pattern; // store the pattern that "made your day" and exit the loop
break;
} catch (DateTimeParseException e) {
// no need for anything here but telling the loop to do the next try
continue;
}
}
// check if the parsing was successful (output must have a value)
if (output != null) {
System.out.println("Successfully parsed " + input
+ " to " + output.format(DateTimeFormatter.ISO_LOCAL_DATE) // BUILT-IN pattern!
+ " having used the pattern " + patternThatWorked);
}
}
此输出
Successfully parsed 08-Nov-2011 to 2011-11-08 having used the pattern dd-MMM-yyyy
答案 1 :(得分:0)
一个非常粗糙的正则表达式是:
\d{2}[- ]\w{3}[- ]\d{4}
08-Nov-2011
21 Mar 2019
此处示例:https://regex101.com/r/01vslq/1。
但是,最好使用一个不允许使用99-Nov-9999
之类的正则表达式,因此您可以尝试更详尽的here。但是,更好的是,可能使用Java日期解析-如果您需要进行合法的日期解析,那么这对于regex来说不是一个很好的用例-例如,2月不应允许数字29、30、31和很多其他细微差别。使用java.time.DateTimeFormatter
(在上面的评论中提到)。
答案 2 :(得分:0)
您可以按以下模式使用SimpleDateFormat:dd-MMM-yyyy
。点击链接查看可能的模式。
SimpleDateFormat
可能在参数无效的地方抛出ParseException
。因此,您可以使用try-catch块包装该调用。
例如:
private final String pattern = "dd-MMM-yyyy";
private final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
public boolean validateDate(String date) {
try {
sdf.parse(date);
return true;
} catch (ParseException e) {
return false;
}
}
如果08-Nov-2011
和08 Nov 2011
的格式不同,请尝试统一它们(例如,从第一个中删除破折号)。