Home » Php » php – English to Time

php – English to Time

Posted by: admin July 12, 2020 Leave a comment

Questions:

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.
}
How to&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
  }

}

Answer:

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.

Answer:

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

You could try that…

Answer:

Cocoa‘s and GNUStep‘s NSDateFormatter are able to handle such time representations. The GNUStep version is open-source.