解析嵌入在Java中的其他Text中的日期

时间:2011-06-20 09:27:50

标签: java date

我需要解析嵌入在某些任意文本中的日期,如下所示

"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 个答案:

答案 0 :(得分:1)

您可以使用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);

如果格式良好,parse方法应该能够从字符串构造一个日期对象。

以下是documentation

修改

知道日期在字符串末尾是 始终 ,并且日期部分总是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);

答案 1 :(得分:0)

使用正则表达式从表达式中提取日期。在这种情况下:

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

parenthese()定义了一个可以使用getGroup()检索的组。

答案 2 :(得分:0)

如果您知道输入字符串中日期开始的位置,您可以执行以下操作:

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

如果您不知道该位置,可以使用正则表达式查找格式的日期。

答案 3 :(得分:0)

以下是一种解决方法:

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

答案 4 :(得分:0)

这不是防弹,但应该为您提供良好的服务。它将匹配任何“看起来像”日期的字符串中的日期:

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

答案 5 :(得分:0)

这是一种绝对有效的暴力方法:

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

它只扫描字符串,尝试每个开始位置,直到它解析日期