Преобразование удобочитаемой даты в объект даты Java - PullRequest
2 голосов
/ 12 февраля 2010

Вот моя проблема - мне нужно проанализировать строку и выяснить, содержит ли она дату. Примеры строк:

"Завтра в 2 часа ночи" "16 февраля 2010 16:00" "Сегодня 16:00"

Знаете ли вы о какой-либо java-библиотеке, которая занимается преобразованием читаемых дат человеком?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

проверьте здесь решение strtotime PHP () в Java

Это в основном реализация PHP strtotime в Java

0 голосов
/ 12 февраля 2010

Это два вопроса, один касается идентификации, другой - конверсии.

Идентификация возможного контекста даты (относительно) проста, однако преобразование глубоко проблематично по ряду причин, в частности, из-за большого разнообразия способов семантического выражения даты, а также из-за сопутствующих неясностей и искажений, которые могут возникнуть. Давайте посмотрим на некоторые очевидные подводные камни здесь:

  • «Послезавтра в 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. В качестве альтернативы вы можете выполнить итерацию массива регулярных выражений в некотором роде, но это будет медленно. Вы, вероятно, получите много ложных срабатываний, но вы, очевидно, сможете улучшить эту простую модель.

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