2009-12-01 3 views
8

Кто-нибудь знает о хорошем классе/библиотеке для преобразования английских представлений о времени в метку времени?English to Time

Цель состоит в том, чтобы преобразовать естественные языковые фразы, такие как «через десять лет» и «три недели» и «через 10 минут», и разработать для них наилучшую временную метку unix.

Я взломал какой-то довольно бедный и непроверенный код, чтобы продолжить работу, но я уверен, что там есть большие парсеры для календарей и т. Д.

private function timeparse($timestring) 
{ 
    $candidate = @strtotime($timestring); 
    if ($candidate > time()) return $candidate; // Let php have a bash at it 

    //$thisyear = date("Y"); 
    if (strpos($timestring, "min") !== false) // Context is minutes 
    { 
      $nummins = preg_replace("/\D/", "", $timestring); 
      $candidate = @strtotime("now +$nummins minutes"); 
      return $candidate; 
    } 

    if (strpos($timestring, "hou") !== false) // Context is hours 
    { 
      $numhours = preg_replace("/\D/", "", $timestring); 
      $candidate = @strtotime("now +$numhours hours"); 
      return $candidate; 
    } 

    if (strpos($timestring, "day") !== false) // Context is days 
    { 
      $numdays = preg_replace("/\D/", "", $timestring); 
      $candidate = @strtotime("now +$numdays days"); 
      return $candidate; 
    } 

    if (strpos($timestring, "year") !== false) // Context is years (2 years) 
    { 
      $numyears = preg_replace("/\D/", "", $timestring); 
      $candidate = @strtotime("now +$numyears years"); 
      return $candidate; 
    } 

    if (strlen($timestring) < 5) // 10th || 2nd (or probably a number) 
    { 
      $day = preg_replace("/\D/", "", $timestring); 
      if ($day > 0) 
      { 
        $month = date("m"); 
        $year = date("y"); 
        return strtotime("$month/$day/$year"); 
      } 
      else 
      { 
        return false; 
      } 
    } 

    return false; // No can do. 
} 
+1

Как насчет «три года, два дня и пять минут в будущее "в качестве вклада? – chelmertz

+0

Да, точно такие вещи. Это то, что мне нужно. –

+2

«три года, два дня и пять минут» и тому подобное должны легко трансформироваться в интервал ISO8601: «P3Y2DT5M», который вы можете подавать на DateInterval и добавлять к объекту DateTime. – dnagirl

ответ

0

Cocoa 's и GNUStep' s NSDateFormatter способны обрабатывать такие временные представления. Версия GNUStep является открытым исходным кодом.

+0

вряд ли поможет многим, учитывая тег php. сомневаюсь, что он ищет библиотеки какао –

+0

Я думаю, что точка, которую пытается сделать mouviciel, заключается в том, что он может переносить библиотеку на php. –

+0

Благодарим за сообщение. Я ценю это предложение, но есть довольно большой барьер для входа туда, и я не знаю, как хорошо он работает, и поэтому я неохотно инвестирую время. Я посмотрю на это, если не смогу найти другое решение. –

2

Используйте класс DateTime.

.:

например
$string='four days ago'; 
$d=date_create($string); 
$d->getTimestamp(); 

ETA: , которые вы можете расширить:

class myDateTime extends DateTime { 
    static $defined_expressions=array(...); 

    function __construct($expression=NULL) { 
    if ($exp=$this->translate($expression)) { 
     parent::__construct($exp); 
    } 
    } 

    function translate($exp) { 
    //check to see if strtotime errors or not 
    //if it errors, check if $exp matches a pattern in self::$defined_expressions 
    return $exp, modified $exp or false 
    } 

} 
+1

Похоже, этот класс просто использует strtotime(), который недостаточно адекватен или достаточно силен ... –

+0

Он может принимать фразы strtotime и ISO8601 (используя конструктор). То, что я нашел в отношении дат естественного языка, заключается в том, что вы в значительной степени должны ограничивать синтаксис определённым набором. Вы можете рассмотреть возможность расширения DateTime, указав надмножество выражений, которое вы можете сопоставить с стандартными выражениями даты PHP. – dnagirl

+0

ОК, давая это попробовать, спасибо. –

1

Некоторое время назад я наткнулся на http://www.timeapi.org, который преобразует природные запросы языка во время. Это API.

Исходный код рубина находится на github. Если нужно, я думаю, вы могли бы попытаться перенести его на PHP.

1

Только что получил уведомление от PHPClasses, с одним из призеров ежемесячной инновационной премии: Text to Timestamp

Вы могли бы попробовать, что ...

+0

Глядя на это, это очень приятно. Вы даже можете настроить его и легко добавить другие элементы ... – Franz

+0

После 20 минут просмотра примеров я понятия не имею, как использовать его, даже если он делает то, что я хочу ... Похоже, что пользователь ожидается добавить все возможные запросы и отобразить их на время?«$ obj-> addTimer (time() - 60 * 60 * 60, time(),« 1 час назад »); –

+0

Да, я признаю, документация выглядит ужасно. Тем не менее, я считаю, что есть несколько строк по умолчанию, которые уже «установлены» ... – Franz