Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

English to Time

Does anyone know of a good class / library to convert English representations of time into timestamps?

The goal is to convert natural language phrases such as "ten years from now" and "three weeks" and "in 10 minutes" and working out a best match unix timestamp for them.

I have hacked up some pretty poor and untested code to get going on it, but I am sure there are great parsers out there for calendars and such.

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.
}
like image 875
Antony Carthy Avatar asked Dec 01 '09 13:12

Antony Carthy


3 Answers

Use the DateTime class.

e.g.:

$string='four days ago';
$d=date_create($string);
$d->getTimestamp();

ETA: which you could extend:

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
  }

}
like image 131
dnagirl Avatar answered Nov 06 '22 06:11

dnagirl


Sometime ago I had come across http://www.timeapi.org which converts natural language queries into time. It is an API though.

The ruby source code is on github. If need be, I guess you could try to port it to PHP.

like image 29
vsr Avatar answered Nov 06 '22 07:11

vsr


Just got a notification from PHPClasses, with one of the runner-ups of the monthly innovation award: Text to Timestamp

You could try that...

like image 27
Franz Avatar answered Nov 06 '22 05:11

Franz