Bir saygın PHP Datetime ayrıştırıcı

5 Cevap php
echo date('r',strtotime("16 Dec, 2010")); //Tue, 16 Dec 2008 20:10:00 +0530
echo date('r',strtotime("16 Dec  2010")); //Sat, 16 Jan 2010 00:00:00 +0530

Bu sadece yanlış ... Bu başarısız veya doğru ayrıştırmak gerekir Ya. Eğer php herhangi bir sağlam doğal dil tarih / saati ayrıştırıcı biliyor musunuz? Nasıl php doğal dil tarih zaman ayrıştırmak?

Edit:

var_dump(strtotime("16 Dec, abcd")); //bool(false)

"16 Aralık 2010" geçerli bir GNU tarih girdi biçimi ya ya da değildir. İlk durumda doğru cevap dönmelidir ve ikinci false dönmelidir. Bu benim 'yanlış' demek budur.

Edit:

Hop kullanıcı girişi önemli bir değişiklik kabul tahmin olarak amacı budur.

5 Cevap

Eğer zaman dize temsil ne biçim biliyorum, bunu ayrıştırmak için uygun biçim dize ile birlikte strptime() kullanabilirsiniz. Bu dize yorumlamak edemez zaman en azından biçimine göre bir hata bildirir.

Bu işlev PHP 5.1.0 ve yukarı var.

Eğer keyfi kullanıcı girişi almak istiyorsanız o bir yanlış yorumlanır tarih hakkında bir şeyler yapabiliriz, böylece, kullanıcıya açık ve bariz geribildirim sunmalıdır. Çoğu zaman, zaten bir sorun olmayacak ve hiç (American vs Avrupa biçimi düşünmek) bütün sorunlu durumlarda yakalamak olamaz.

Bu yanlış değil, siz temin konum veri belirsiz - fark bir dünya var.

Belirsiz veriler makul ondan bekleyebilirsiniz en bir 'en iyi tahmin' demektir. Bunu bu iyi tahmin yapar nasıl katılmıyorum olabilir, ama bu 'yanlış' değil, büyük olasılıkla ne sadece farklı bir görüş bulunuyor. Sen belirsizlik çıkarmadan herhangi bir daha fazla bekleyemeyiz.

Further thoughts, mostly to hop's comments on the OP:

Sessizce başarısız bir seçenek değil - ne zaman ya da sessizce başarısız aynı kurallara tabidir karar, ve aynı belirsizlikler tarafından atılır.

Örnek dizeleri hangisi yanlıştır ve sessizce başarısız gerekir? Senin yanındaki adam? O aynı bir yanlış olduğunu mu düşünüyor? Ne onları yan yana karşılaştırarak değil tarafından bağlamını kaldırırsanız?

Tek şey 'yanlış' burada hep belirsizlik tabi olacak verilerden bir tam anlamını deşifre edebilmek için bir işlev bekliyor ... ve bu sadece bu örnekler, ben bile (:) henüz tarihlere var değil 1/2/08 Şubat ayının ilk? veya Jan 2nd? 1908? 2008? 8?)

Doğru, ben 'is_this_art' adında bir işlevi yazmak için gidiyorum, dedi ...

Eğer uygun kullanıcı girişi işlemek için gereken esnekliğe sahip Kronik adında bir Ruby sınıf vardır: http://chronic.rubyforge.org/

Ben sadece portu PHP'nin DateTime ile Ruby'nin Zaman değiştirerek PHP eminim.

strtotime Bunun için bulabildiğim en iyi işlevdir. Ben kullanılan biçimlendirme üzerinde en az some bilgi gerektiren, çünkü bir tarih keyfi bir dize temsili hiç,% 100 doğru yorumlanır şüpheliyim.

Başka bir deyişle: (php yorumlayıcı doğru bir şekilde belirttiği gibi, sadece senin sorunun bunların iki farklı sürümü kullanılır) doğal dili tanımlamak Lütfen

Ben belki birisi zaten yazılı bir teklif olsa, herhangi aşina değilim. Bu arada, ben strtotime aracılığıyla koyarak önce bir regex veya diğer munging aracılığıyla tarih verilerini çalışan ve döndürülen tarih kabul aralığında düşerse görmek için kendi çıkışında biraz aklı-denetimi kullanmanızı tavsiye ediyorum.