2011-11-11 7 views
36

Olası Çoğalt:JavaScript Tespit Geçerli Tarihler

var text = $('#Date').val(); 
var date = Date.parse(text); 

if (isNaN(date)) { 
     // Invalid date 
} 

Ama Date.parse düşünüyor bulundu:
Detecting an “invalid date” Date instance in JavaScript

Ben geçerli bir tarih tespit etmek için aşağıdaki kullanıyordum Aşağıdaki geçerli tarihler (gg/gg/yyyy)

  • 2/30/2011
  • 11/31/2011

gün sayısı ayda toplam gün sayısını aşan zaman geçersiz tarihleri ​​algılamak için başka yol var?

GÜNCELLEME: Daha da büyük bir sorun, jQuery doğrulama eklentisinin geçersiz bir tarih olarak algılamamasıdır!

ÇÖZÜM:

Ben tarihleri ​​doğrulamak için aşağıdaki işlevi oluşturduk Guffa yorumları, @ dayanarak

:

function validDate(text) { 

    var date = Date.parse(text); 

    if (isNaN(date)) { 
     return false; 
    } 

    var comp = text.split('/'); 

    if (comp.length !== 3) { 
     return false; 
    } 

    var m = parseInt(comp[0], 10); 
    var d = parseInt(comp[1], 10); 
    var y = parseInt(comp[2], 10); 
    var date = new Date(y, m - 1, d); 
    return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d); 
} 
+3

Date.parse bunların doğru olmadıklarını düşünür, ancak bunları sizin için doğru tarihlere dönüştürür. Örneğin. 02/02/2011'de sona erecek vot 03/02/2011' – Andreas

+1

'un kapanış olarak kapatılmasından sonra, verilen sorunun * aynı değil, her ne kadar ilişkili olduğunu anladım. – zzzzBov

+1

Birden çok lokalde girişi desteklemem gerektiğinden, kendi tarih ayrıştırıcımızı uyguladık. Bu hatayı algılayabilmemizin tek yolu, oluşturulan Tarih –

cevap

72

Bir tarihin geçerli olup olmadığını kontrol etmek için tarihin bileşenlerini ayrıştırabilir, bir Date nesnesi oluşturabilir ve verilerin içindeki bileşenlerin ayrıştırılmış bileşenler ile aynı olup olmadığını kontrol edebilirsiniz. Aralık dışı olan öğelerden bir Date nesnesi oluşturursanız, değerler geçerli bir tarih oluşturmak için sonraki/önceki periyoda akar.

Örneğin, new Date(2011,0,42), 1/25/2011 yerine 2/11/2011 tarihini içeren bir nesne oluşturur.

Bileşenleri tam tarih yerine ayrıştırarak, farklı tarih biçimleriyle ilgili sorunu da çözeceksiniz. Tarayıcım, örneğin d/m/y yerine y-m-d gibi bir tarih formatı bekler.

Örnek:

var text = '2/30/2011'; 
var comp = text.split('/'); 
var m = parseInt(comp[0], 10); 
var d = parseInt(comp[1], 10); 
var y = parseInt(comp[2], 10); 
var date = new Date(y,m-1,d); 
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) { 
    alert('Valid date'); 
} else { 
    alert('Invalid date'); 
} 

Demo: Bir senaryo yazabilirim http://jsfiddle.net/Guffa/UeQAK/

+1

Bu harika çalışıyor! Bunun dışında date.getDay() öğesini date.getDate() olarak değiştirmeniz gerekir. –

+1

İşte güncel demo: http://jsfiddle.net/zKb6c/ –

+0

@NickOlsen: Teşekkürler, cevabı güncelledim. – Guffa

3

tarih formatı M/D/YYYY olarak sabit ise, olabilir yeniden biçim çözümlenir tarih ve Girdi ile eşleşiyorsa, bu boşluk veya sıfır doldurulmuş sayıları tolere etmeyecektir.

Kullanıcının girdisini tam olarak tutmanıza gerek kalmazsa, tarihi yeniden biçimlendirebilir ve yazdıklarının aynısını yaptırabilirsiniz.

Ancak bunu yapamazsanız, bileşenleri bir RegExp kullanarak ayrıştırıp, bunları Date yöntemlerinden değerlerle karşılaştırırdım.

0

el ile yapmak: Elbette

function checkDate(day, month) { 
    if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) { 
     alert("Date is valid") 
    } 
    else if (month == 2 && day <= 28) { 
     alert("Date is valid") 
    } 
    else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) { 
     alert("Date is valid") 
    } 
    else { 
     alert("Date is in-valid") 
    } 
} 

, ayrıca sıçrama için dışarı bakmak şey gerekir yıl, ama sadece 4 ile bölünebilir herhangi bir yıl 100 ile değil unutmayın ve yılın ilk iki basamağı 4 ile bölünemez sürece bir sıçrama yıl olduğunu. Bu içine dahil edilmesi kolay olmalıdır işlevi.

+2

ifadesi '==' değil '='? – user1575921

0

örnek yanlıştır

doğru

if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30) 

<= yerine

= olduğunu Ama örnek harika!