Дата разбора встроена в другой текст в Java - PullRequest
1 голос
/ 20 июня 2011

Мне нужно разобрать дату, встроенную в какой-то произвольный текст, следующим образом

"hello world, good Day Thu Mar 03 07:13:56 GMT 2011"

Я знаю шаблон даты (ниже), однако я не уверен, как разобрать ее из текстовой строки выше,Как мне это сделать?

String format = "E MMM dd HH:mm:ss z yyyy";
new SimpleDateFormat(format).parse(date);

Ответы [ 6 ]

1 голос
/ 20 июня 2011

Вы можете использовать класс DateFormat!

Если вы знаете, по какому индексу в тексте указана дата,

String text = "hello world, good Day Thu Mar 03 07:13:56 GMT 2011";
String dateText = text.substring(22);
DateFormat df = DateFormat.getDateInstance();
Date date = df.parse(dateText);

Метод синтаксического анализа должен быть в состоянии построить объект даты из строки, если он хорошо отформатирован.

Вот документация

EDIT

Зная, что дата ВСЕГДА в конце строки и что часть даты всегда имеет длину 28 символов (?) ... вы можете вырезать конец строку и проанализируйте ее до даты.

String text = "hello world, good Day Thu Mar 03 07:13:56 GMT 2011";
String dateText = text.substring(text.length()-28); //28 is the date portion
DateFormat df = DateFormat.getDateInstance();
Date date = df.parse(dateText);
0 голосов
/ 20 июня 2011

Вот метод грубой силы, который абсолютно работает:

public static Date parseDate(String input)
{
    SimpleDateFormat format = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
    for (int i = 0; i < input.length() - 29; i++)
    {
        try
        {
            return format.parse(input.substring(i, i + 29));
        }
        catch (ParseException ignore) {}
    }
    throw new IllegalArgumentException();
}

Он просто сканирует строку, пробуя каждую начальную позицию, пока не проанализирует дату

0 голосов
/ 20 июня 2011

Это не пуленепробиваемое, но оно должно хорошо вас обслуживать.Он будет соответствовать дате в любой строке, которая «похожа» на дату:

    String input = "hello world, good Day Thu Mar 03 07:13:56 GMT 2011 foo bar";
    String regex = "(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d\\d \\d\\d:\\d\\d:\\d\\d [A-Z]{3} [12]\\d\\d\\d";
    Matcher matcher = Pattern.compile(regex).matcher(input);
    if (!matcher.find())
        throw new IllegalArgumentException("Couldn't find a date");
    String datestr = matcher.group();
    Date date = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy").parse(datestr);
0 голосов
/ 20 июня 2011

Вот один из обходных путей:

    String date = "hello world, good Day Thu Mar 03 07:13:56 GMT 2011";
    date = date.replaceAll("^(?:.*)(Mon|Tue|Wed|Thu|Fri|Sat|Sun|Sunday)", "$1");
    System.out.println(date);
0 голосов
/ 20 июня 2011

Если вам известна позиция во входной строке, где начинается дата, вы можете сделать что-то вроде этого:

String input = "hello world, good Day Thu Mar 03 07:13:56 GMT 2011";
String format = "E MMM dd HH:mm:ss z yyyy";
new SimpleDateFormat(format).parse(input, new ParsePosition("hello world, good Day ".length()));

Если вы не знаете позицию, вы можете использовать регулярное выражение для поискадата в вашем формате.

0 голосов
/ 20 июня 2011

Используйте регулярное выражение, чтобы извлечь дату из выражения. В этом случае:

([Mon|Thu|{rest of days}] [Jan|Feb|{rest of months} .... \d\d\d\d)

Скобка () определяет группу, которую можно получить с помощью getGroup ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...