С английского на время - PullRequest
8 голосов
/ 01 декабря 2009

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

Цель состоит в том, чтобы преобразовать фразы на естественном языке, такие как «десять лет спустя» и «три недели» и «через 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.
}

Ответы [ 4 ]

2 голосов
/ 01 декабря 2009

Используйте класс 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 голос
/ 02 декабря 2009

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

Вы можете попробовать это ...

1 голос
/ 01 декабря 2009

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

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

0 голосов
/ 01 декабря 2009

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

...