我需要解析嵌入在某些任意文本中的日期,如下所示
"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);
答案 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方法应该能够从字符串构造一个日期对象。
知道日期在字符串末尾是 始终 ,并且日期部分总是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();
}
它只扫描字符串,尝试每个开始位置,直到它解析日期