如何检查字符串是否包含 Java 中的日期?

How to check if a string contains a date in Java?

如何检查字符串是否包含以下形式的日期:

Sunday, January 15, 2012 at 7:36pm EST

我正在处理的数据包含大量字符串。但是我正在寻找的字符串类型包含一个 2 或 3 个单词的名称和一个日期。我正在检查日期以识别这些类型的字符串。

我已经找到了这种类型日期的简单日期格式。

String string1 = "Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST";
String string2 = "Aritra Sinha Nirmal Friday, April 1, 2016 at 10:16pm EDT";    

SimpleDateFormat format = new SimpleDateFormat("EEEEE, MMM dd, yyyy 'at' hh:mmaa z");

但我不知道如何进行下一步。

我猜正则表达式可能有效,但我不知道如何在 months/days 的名称长度不同时实现它。即 'May' 比 'December'.

短得多

我想知道是否有使用正则表达式的解决方案或更简单的解决方案。

我知道还有其他帖子在问类似的问题,但他们没有回答我的问题。

您可以使用 simpleDateFormat 解析方法对其进行测试。要继续您的代码,请用 try/catch 将代码括起来,例如:

try {
    Date date = format.parse(string);
} catch (ParseException e) {
        //the string is not applicable to the date format
}

如果日期是遵循SimpleDateFormat中的格式指南的字符串,则日期将创建成功。

您可以先使用正则表达式检查您的日期是否存在:

\w+,\s+\w+\s+\d+\,\s+\d+\s+at\s+\d+:\d+(pm|am)\s+\w{3,4}

此正则表达式匹配两者

Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST
Aritra Sinha Nirmal Friday, April 1, 2016 at 10:16pm EDT

https://regex101.com/r/V0dAf8/2/

当您在文本中找到匹配项后,您可以使用 SimpleDateFormat 检查其格式是否正确。

String input = "Rahul Chowdhury Sunday, January 15, 2012 at 7:37pm EST";
String regex = "(\w+,\s+\w+\s+\d+\,\s+\d+\s+at\s+\d+:\d+(pm|am)\s+\w{3,4})";
Matcher matcher = Pattern.compile(regex).matcher(input);
if (matcher.find()) {
  System.out.println(matcher.group(1));
}

这将打印:

Sunday, January 15, 2012 at 7:37pm EST

如果您不想使用 Regex,您可以这样做(我知道这很痛苦,但只是一种不同的方法)。

public class ParseDate {

    public static void main(String[] args) {
        String date = "Rahul Chowdhury Sunday, January 15, 2012 at 7:36pm EST";
        //Pattern: "Fullname EEEEE, MMM dd, yyyy 'at' hh:mmaa z"
        String dateComponents[] = date.split(",");
        String fullName = dateComponents[0].substring(0, dateComponents[0].lastIndexOf(" "));
        String dayText = dateComponents[0].substring(dateComponents[0].lastIndexOf(" "));
        String month = dateComponents[1].trim().split(" ")[0];
        String dayNumber = dateComponents[1].trim().split(" ")[1];
        String year = dateComponents[2].split("at")[0];
        String time = dateComponents[2].split("at")[1].trim().split(" ")[0];
        String zone =dateComponents[2].split("at")[1].trim().split(" ")[1];

        // if you want to go further 
        String hour = time.split(":")[0];
        String minutes = time.split(":")[1].substring(0,2);
        String aa = time.split(":")[1].substring(2,4);


        System.out.println(fullName + " " + dayText + " " + month + " " + dayNumber + " " + year + " " + time + " " + zone);
        System.out.println(hour + " " + minutes + " " + aa);
    }


}

输出

Rahul Chowdhury Sunday January 15  2012  7:36pm EST
7 36 pm