2009-12-01 11 views
8

qualcuno sa di una buona classe/biblioteca per convertire le rappresentazioni in inglese di tempo in timestamp?Inglese a Tempo

L'obiettivo è quello di convertire frasi in linguaggio naturale come "dieci anni da oggi" e "tre settimane" e "in 10 minuti" e di elaborare una migliore corrispondenza unix timestamp per loro.

ho violato un po 'di codice piuttosto scarsa e non testato per andare avanti su di esso, ma sono sicuro che ci sono grandi parser là fuori per i calendari e così via.

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

Come su "tre anni, due giorni e cinque minuti nel futuro "come input? – chelmertz

+0

Sì, esattamente cose del genere. Questo è quello di cui ho bisogno. –

+2

"tre anni, due giorni e cinque minuti" e simili dovrebbe tradurre facilmente in un intervallo ISO8601: "P3Y2DT5M", che si può nutrire per un DateInterval e aggiungere ad un oggetto DateTime. – dnagirl

risposta

0

Cocoa 's e GNUStep' s NSDateFormatter sono in grado di gestire tali rappresentazioni di tempo. La versione GNUStep è open-source.

+0

è improbabile che aiuti molto dato il tag php. dubito che stia cercando le librerie di cacao –

+0

Penso che il punto che mouviciel sta cercando di fare è che può portare la libreria su php. –

+0

Grazie per aver postato questo. Apprezzo questo suggerimento, ma c'è una barriera piuttosto grande per entrare lì, e non so quanto bene funzioni e sono quindi riluttante a investire tempo. Lo guarderò se non sono in grado di trovare un'altra soluzione. –

2

utilizzare la classe DateTime.

es .:

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

ETA: che si potrebbe estendere:

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

Sembra che questa classe utilizza solo strtotime(), che non è abbastanza adeguata o abbastanza potente ... –

+0

Si può prendere sia strtotime e ISO8601 (utilizzando il costruttore) frasi. Quello che ho trovato che riguarda le date in linguaggio naturale è che devi praticamente limitare la sintassi a un set definibile. Potresti prendere in considerazione l'estensione di DateTime definendo un superset di espressioni che potresti mappare a espressioni di date PHP standard. – dnagirl

+0

OK sto provando, grazie. –

1

Qualche tempo fa mi ero imbattuto in http://www.timeapi.org che converte le query in linguaggio naturale nel tempo. È un'API però.

Il codice sorgente rubino è su GitHub. Se necessario, immagino che potresti provare a portarlo su PHP.

1

appena ricevuto una notifica da PHPClasses, con uno dei runner-up del premio mensile innovazione: Text to Timestamp

si potrebbe provare che ...

+0

Guardandolo, è molto bello. Puoi anche configurarlo e aggiungere altri elementi tu stesso molto facilmente ... – Franz

+0

Dopo 20 minuti guardando gli esempi, non ho idea di come usarlo anche se fa quello che voglio ... Sembra che l'utente sia atteso aggiungere tutte le query possibili e mapparle alla volta?"$ obj-> addTimer (time() - 60 * 60 * 60, time(), '1 ora fa');" –

+0

Sì, lo ammetto, la documentazione sembra orribile. Tuttavia, credo che ci siano alcune stringhe predefinite già "installate" ... – Franz