2009-12-01 19 views
8

¿Alguien sabe de una buena clase/biblioteca para convertir representaciones de tiempo en inglés en marcas de tiempo?English to Time

El objetivo es convertir frases en lenguaje natural como "diez años a partir de ahora" y "tres semanas" y "en 10 minutos" y elaborando la marca de tiempo de unix de mejor combinación para ellos.

He cortado un código bastante pobre y no probado para ponerlo en marcha, pero estoy seguro de que hay analizadores geniales para calendarios y cosas por el estilo.

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

¿Qué hay de "tres años, dos días y cinco minutos en el futuro "como entrada? – chelmertz

+0

Sí, exactamente cosas así. Esto es lo que necesito. –

+2

"tres años, dos días y cinco minutos" y similar debería traducirse fácilmente en un intervalo ISO8601: "P3Y2DT5M" que puede alimentar a un Intervalo de fecha y agregar a un objeto DateTime. – dnagirl

Respuesta

0

Cocoa 's y GNUStep' s NSDateFormatter son capaces de manejar tales representaciones de tiempo. La versión GNUStep es de código abierto.

+0

es poco probable que ayude mucho dada la etiqueta php. duda que esté buscando librerías de cacao –

+0

Creo que el punto que mouviciel está tratando de hacer es que pueda portar la biblioteca a php. –

+0

Gracias por publicar esto. Agradezco esta sugerencia, pero hay una gran barrera de entrada allí, y no sé qué tan bien funciona y, por lo tanto, soy reacio a invertir tiempo. Lo veré si no puedo encontrar otra solución. –

2

Utilice la clase DateTime.

ej .:

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

ETA: que se podría extender:

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

Parece que esta clase solo usa strtotime() que no es lo suficientemente adecuada o poderosa ... –

+0

Puede tomar strtotime e ISO8601 (usando el constructor). Lo que he encontrado tratando con fechas de lenguaje natural, es que tienes que limitar la sintaxis a un conjunto definible. Puede considerar ampliar DateTime definiendo un superconjunto de expresiones que pueda correlacionar con expresiones de fecha PHP estándar. – dnagirl

+0

Bien, estoy dando una oportunidad, gracias. –

1

Hace algún tiempo me había encontrado http://www.timeapi.org que convierte las consultas en lenguaje natural en el tiempo. Sin embargo, es una API.

El código fuente de ruby ​​está en github. Si es necesario, supongo que podrías tratar de portarlo a PHP.

1

acaba de recibir una notificación por parte de PHPClasses, con uno de los accésit del premio mensual de la innovación: Text to Timestamp

usted podría intentar que ...

+0

Mirándolo, es muy bueno. Incluso puede configurarlo y agregar otros elementos usted mismo muy fácilmente ... – Franz

+0

Después de 20 minutos mirando los ejemplos, no tengo ni idea de cómo usarlo, incluso si hace lo que quiero ... Parece que se espera que el usuario para agregar todas las consultas posibles y asignarlas a un tiempo?"$ obj-> addTimer (time() - 60 * 60 * 60, time(), '1 hour ago');" –

+0

Sí, lo admito, la documentación se ve horrible. No obstante, creo que hay algunas cadenas por defecto ya "instaladas" ... – Franz