如何使用Java检查类似“ 08-Nov-2011”的字符串是否是有效日期?

时间:2019-11-14 07:19:46

标签: java regex

我想检查输入的字符串是否为有效日期。 字符串像:-    "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 然后,它将失败。

请帮助我解决此问题。

3 个答案:

答案 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)

您可以按以下模式使用SimpleDateFormatdd-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-201108 Nov 2011的格式不同,请尝试统一它们(例如,从第一个中删除破折号)。