Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

How do I check if a string contains a date of this form:

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

The data I'm working with contains a ton of strings. But the type of string I'm looking for contains a 2 or 3 word name and a date. I'm checking for dates to identify these types of strings.

I've figured out the simpleDateFormat for this type of date.

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");

But I have no idea how to proceed further.

I'm guessing regex might work but I don't know how to implement that when the length of the names of months/days vary. i.e. 'May' is much shorter than 'December'.

I'm wondering if there is a solution using regex or a simpler solution to this.

I know there are other threads asking similar questions, but they don't answer my question.

like image 838
Rahul Chowdhury Avatar asked May 21 '17 13:05

Rahul Chowdhury


2 Answers

You could first check the presence of your date with a regex:

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

This regex matches both

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/

When you found the match in your text then you could use SimpleDateFormat to check if it is well formed.

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));
}

This will print:

Sunday, January 15, 2012 at 7:37pm EST
like image 159
freedev Avatar answered Oct 06 '22 01:10

freedev


If you don't want to use Regex you may do something like this (I know it is a pain but just a different approach).

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);
    }


}

Output

Rahul Chowdhury Sunday January 15  2012  7:36pm EST
7 36 pm
like image 21
Yahya Avatar answered Oct 06 '22 01:10

Yahya