2009-12-01 17 views
8

Zamanın İngilizce gösterimlerini zaman damgalarına dönüştürmek için iyi bir sınıf/kütüphane bilen var mı?Turkish to Time

Amaç, "on yıl sonra" ve "üç hafta" ve "10 dakikada" gibi doğal dil ifadelerini dönüştürmek ve bunlar için en iyi eşleşme unix zaman damgasını çalışmaktır.

Devam etmek için bazı oldukça zayıf ve test edilmemiş kodlarım hackledim, ancak eminim takvimler ve benzerleri için harika ayrıştırıcılar var.

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

nasıl üç yıl, iki gün ve beş dakika" hakkında geleceğe "girdi olarak? – chelmertz

+0

Evet, tam olarak böyle şeyler. İhtiyacım olan bu. –

+2

"üç yıl, iki gün ve beş dakika" ve ISO8601 aralık kolayca çevirmek gerektiğini benzer: "P3Y2DT5M" Bir DateInterval yem ve bir DateTime nesnesine ekleyebilirsiniz. – dnagirl

cevap

0

Cocoa 'ler ve GNUStep' ın ​​NSDateFormatter böyle zaman temsillerini idare edebiliyoruz. GNUStep sürümü açık kaynaklıdır.

+0

. Şüphesiz o kakao kütüphaneleri –

+0

arıyor bence yapmaya çalışıyor mouviciel nokta o liman php kütüphane can olmasıdır. –

+0

Bunu gönderdiğiniz için teşekkür ederiz. Bu öneriyi takdir ediyorum, ancak oraya giriş için oldukça büyük bir engel var ve ne kadar iyi çalıştığını bilmiyorum ve bu yüzden zaman harcamaya isteksizim. Başka bir çözüm bulamıyorsam ona bakacağım. –

2

DateTime sınıfını kullanın.

ör .:

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

ETA: sen uzatmak olabilir: Bazen önce zaman içine doğal dil sorguları dönüştürür http://www.timeapi.org rastlamıştı

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

Bu sınıf gibi görünüyor sadece strtotime() oldukça yeterli veya yeterince güçlü değil ... –

+0

Hem strtotime hem de ISO8601 (yapıcı kullanarak) ifadeler alabilir. Doğal dil tarihleriyle uğraştığım şey, sözdizimini tanımlanabilir bir kümeyle sınırlamak zorunda olmanız. Standart PHP tarih ifadelerini eşleyebildiğiniz bir ifadeler dizisi tanımlayarak DateTime'ı genişletmeyi düşünebilirsiniz. – dnagirl

+0

Tamam, bunu deniyorum, teşekkürler. –

1

. Yine de bir API.

Ruby kaynak kodu github üzerindedir. Gerekirse, PHP'ye yönlendirmeyi deneyebilirsiniz.

1

Sadece aylık yenilik ödülü koşucu çekimler biriyle, PHPClasses bir bildirim var: Text to Timestamp

Bunu deneyebiliriz ...

+0

Baktığımızda çok güzel. Sen Kullanıcının beklendiği gibi eğer görünüyor ... – Franz

+0

20 dakika örneklere bakarak sonra, bunun ne istediğiniz bile nasıl kullanılacağını hiçbir ipucu var ... hatta yapılandırmak ve çok kolayca diğer Eşyaları kendiniz ekleyebilirsiniz Tüm olası sorguları eklemek ve bunları bir zamana eşlemek için?"$ obj-> addTimer (time() - 60 * 60 * 60, time()," 1 saat önce ");" –

+0

Evet, itiraf ediyorum, belgeler korkunç görünüyor. Yine de, ben zaten "yüklü" birkaç varsayılan dizeleri olduğuna inanıyorum ... – Franz

İlgili konular