Это два вопроса, один касается идентификации, другой - конверсии.
Идентификация возможного контекста даты (относительно) проста, однако преобразование глубоко проблематично по ряду причин, в частности, из-за большого разнообразия способов семантического выражения даты, а также из-за сопутствующих неясностей и искажений, которые могут возникнуть. Давайте посмотрим на некоторые очевидные подводные камни здесь:
«Послезавтра в 2 часа дня». Если мы просто оценим «завтра в 2 часа дня», мы будем дрейфовать в течение дня.
"Через два дня после 16.10.2010" .. Становится хуже ...
«незадолго до 21:00 пятницы, 13 марта 2013 г.» Мы можем получить дату назад, но контекст делает ее очень неоднозначной.
Предполагая, что вы хотите идентифицировать только возможное совпадение дат в строке, вы можете сделать что-то вроде этого ...
private final String[] datePatterns = {"Yesterday","Today","Tomorrow", //etc
"Sunday","Monday","Tuesday","Thursday","Friday", // etc
"Lundi","Mardi","Mercredi", //etc in French
"2001","2002", // all the years
"AM","PM",
"January","February","March","August"};
private List lx = new ArrayList();
public boolean mayContainDates(String toCheck)
{
toCheck = toCheck.toUpperCase();
// irl we'd build this list 1 time in the constructor
for(int i = 0; i < datePatterns.length; i++)
{
lx.add(datePatterns[i].toUpperCase());
}
Iterator lit = lx.iterator();
while(lit.hasNext())
{
if (toCheck.contains((String) lit.next())
{
return true;
}
}
return false;
}
Вопрос в том, как настроить массив компараторов datePattern String. В качестве альтернативы вы можете выполнить итерацию массива регулярных выражений в некотором роде, но это будет медленно. Вы, вероятно, получите много ложных срабатываний, но вы, очевидно, сможете улучшить эту простую модель.