2010-10-07 13 views
16

Czy istnieje funkcja isDate w jQuery?Jak ustalić, czy dany ciąg reprezentuje datę?

Powinno zwrócić wartość true, jeśli wejście jest datą, a w innym przypadku false.

+0

chk to: http://docs.jquery.com/Plugins/Validation/Methods/date http://stackoverflow.com/questions/511439/custom-date-format-with-jquery-validation-plugin – jknair

Odpowiedz

0

Date.parse będzie PRB rodzaju się, bez konieczności jQuery:

http://www.w3schools.com/jsref/jsref_parse.asp

Above usuwane po pewnym rodzaju duszy zauważył jak podstawowe parseDate jest naprawdę.

Jest też "parseDate" metoda w plugin jQuery UI DatePicker:

http://docs.jquery.com/UI/Datepicker/parseDate

+0

var d = Date.parse ("13/13/2010"); DAJE 1294857000000 :) CZY MOŻNA UŻYĆ –

+0

Och, wow, to jest do bani! Pomyślałem, że poprawnie ci powiedział, jeśli data jest ważna. –

4

Brak wbudowanej funkcji daty w rdzeniu jQuery ... i tak naprawdę nie robi nic bezpośrednio, aby pomóc w datach, więc nie ma wielu bibliotek na górze (chyba że są to zbieracze dat, itp). There are several JavaScript date libraries available though, aby ułatwić sobie pracę z nimi.

Nie mogę odpowiedzieć na pewno, co jest najlepsze ... zależy to od tego, w jaki sposób wchodzą i od kultury, z którą masz do czynienia, pamiętaj, że różne kultury są używane do wyświetlania ich dat w różnych formatach, szybki przykład, MM/DD/YYYY vs YYYY/MM/DD (lub dziesiątki innych).

2

Najlepszym sposobem uzyskania danych wprowadzanych przez użytkownika jest selektor daty, który podaje jedynie prawidłowe daty. Można tego dokonać za pomocą łańcucha znaków, ale możesz narazić swoich użytkowników, żądając, aby użyli wybranego przez Ciebie formatu.

Musisz podać w walidatorze, jeśli daty poprzedzają miesiące.

Wykorzystuje drugi argument do wymuszenia zamówienia. Bez drugiego argumentu używa domyślnej kolejności komputera.

// computer default date format order: 
Date.ddmm= (function(){ 
    return Date.parse('2/6/2009')> Date.parse('6/2/2009'); 
})() 

pozwalają nazwy miesięcy, a także cyfry: '21 Sty, 2000' lub «Październik 21,1975»

function validay(str, order){ 
    if(order== undefined) order= Date.ddmm? 0: 1; 
    var day, month, D= Date.parse(str); 
    if(D){ 
     str= str.split(/\W+/); 

     // check for a month name first: 
     if(/\D/.test(str[0])) day= str[1]; 
     else if (/\D/.test(str[1])) day= str[0]; 
     else{ 
      day= str[order]; 
      month= order? 0: 1; 
      month= parseInt(str[month], 10) || 13; 
     } 
     try{ 
      D= new Date(D); 
      if(D.getDate()== parseInt(day, 10)){ 
       if(!month || D.getMonth()== month-1) return D; 
      } 
     } 
     catch(er){} 
    } 
    return false; 
} 
0

Jeśli nie chcesz używać plugin jquery znalazłem funkcję w:

http://www.codetoad.com/forum/17_10053.asp

pracuje dla mnie. Inne, które znalazłem, nie działają tak dobrze.

AKTUALIZACJA:

Z pamięci podręcznej wersji strony pod adresem: http://web.archive.org/web/20120228171226/http://www.codetoad.com/forum/17_10053.asp

// ****************************************************************** 
 
// This function accepts a string variable and verifies if it is a 
 
// proper date or not. It validates format matching either 
 
// mm-dd-yyyy or mm/dd/yyyy. Then it checks to make sure the month 
 
// has the proper number of days, based on which month it is. 
 

 
// The function returns true if a valid date, false if not. 
 
// ****************************************************************** 
 

 
function isDate(dateStr) { 
 

 
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; 
 
    var matchArray = dateStr.match(datePat); // is the format ok? 
 

 
    if (matchArray == null) { 
 
     alert("Please enter date as either mm/dd/yyyy or mm-dd-yyyy."); 
 
     return false; 
 
    } 
 

 
    month = matchArray[1]; // [email protected] date into variables 
 
    day = matchArray[3]; 
 
    year = matchArray[5]; 
 

 
    if (month < 1 || month > 12) { // check month range 
 
     alert("Month must be between 1 and 12."); 
 
     return false; 
 
    } 
 

 
    if (day < 1 || day > 31) { 
 
     alert("Day must be between 1 and 31."); 
 
     return false; 
 
    } 
 

 
    if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) { 
 
     alert("Month " + month + " doesn`t have 31 days!") 
 
     return false; 
 
    } 
 

 
    if (month == 2) { // check for february 29th 
 
     var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); 
 
     if (day > 29 || (day == 29 && !isleap)) { 
 
      alert("February " + year + " doesn`t have " + day + " days!"); 
 
      return false; 
 
     } 
 
    } 
 
    return true; // date is valid 
 
}

+0

Link jest uszkodzony. –

32

Jeśli nie chcemy mieć do czynienia z zewnętrznych bibliotek, prosty javascript tylko rozwiązanie to:

function isDate(val) { 
    var d = new Date(val); 
    return !isNaN(d.valueOf()); 
} 

AKTUALIZACJA:       !! Major Caveat !!
@BarryPicker podnosi dobry punkt w komentarzach. JavaScript cicho konwertuje 29 lutego do 1 marca na wszystkie lata wolne od przestępstwa. To zachowanie wydaje się być ograniczone wyłącznie do dni do 31 (np. 32 marca nie jest konwertowane na 1 kwietnia, ale 31 czerwca jest konwertowane na 1 lipca). W zależności od sytuacji, może to być ograniczenie można zaakceptować, ale należy pamiętać o tym:

>>> new Date('2/29/2014') 
Sat Mar 01 2014 00:00:00 GMT-0500 (Eastern Standard Time) 
>>> new Date('3/32/2014') 
Invalid Date 
>>> new Date('2/29/2015') 
Sun Mar 01 2015 00:00:00 GMT-0500 (Eastern Standard Time) 
>>> isDate('2/29/2014') 
true // <-- no it's not true! 2/29/2014 is not a valid date! 
>>> isDate('6/31/2015') 
true // <-- not true again! Apparently, the crux of the problem is that it 
     //  allows the day count to reach "31" regardless of the month.. 
+0

dla asp.net, jeśli używasz formantu CustomValidator, możesz wywołać funkcję z właściwości ClientValidationFunction, ta funkcja powinna być mniej więcej: funkcja IsDate (nadawca, args) { var d = nowa data ($ ('# tbBirthDate ') .val()); args.IsValid =! IsNaN (d.valueOf()); return; } – juanytuweb

+1

Ta metoda nie działa poprawnie w dniu 29 marca 2014 r. - nie było roku przestępnego w 2014 r.W rzeczywistości ta metoda oznacza, że ​​2/30/2014 jest poprawna - i to nigdy nie będzie ważne. W przypadku użycia jako źródła danych 2/30/2014, zmiennej "d" przypisuje się wartość z 2 marca 2014 r. W pierwszym wierszu funkcji, więc następuje niejawna konwersja ... – barrypicker

+0

@barrypicker: Dzięki za główki w górę. Odpowiednio zaktualizowałem swoją odpowiedź. – mwolfe02

0

Przyjechałem do tego rozwiązania, bardziej skomplikowane, jak używać formatu europejskiego i JavaScript jest wyraźnie amerykański!

function CheckDate() 
{ 
    var D = document.getElementById('FlightDate').value; 
    var values = D.split("-") 
    var newD = values [1] + "/" + values [0] + "/" + values[2] 
    var d = new Date(newD); 
    if(d == 'Invalid Date')document.getElementById('FlightDate').value = ""; 
} 

Brudny, ale spełnia swoją rolę. Jeśli Twoi użytkownicy są Amerykanami i umieszczają dzień w środku (co nigdy nie zrozumiem!), Możesz pominąć podział i tworzenie nowegoD.

Jest prawdopodobne, że mogę przesłonić domyślny amerykanizm w JS, ustalając kulturę lub coś w tym rodzaju, ale moja grupa docelowa jest wyłącznie europejska, więc łatwiej było ją tak ustawić. (. Och, to pracował w Chrome, nie testowałem go na cokolwiek innego)

+0

Nie działa w ie! (konwertuje go na zupełnie inną prawidłową datę!) Zamierzałem przekonwertować funkcję C, którą napisałem dla oprogramowania wbudowanego, które weryfikuje dzień w zależności od miesiąca, ale myślałem, że muszę robić tylko takie rzeczy o niskim poziomie w mojej codziennej pracy ! Mają datepicker, będę weryfikować po stronie serwera z VB isdate. Job done. – user2981217

2

Najprostszym sposobem w JavaScript jest:

function isDate(dateVal) { 
    var d = new Date(dateVal); 
    return d.toString() === 'Invalid Date'? false: true; 
} 
1

Problemem jest to, że wejście w 31 lutego zwróci poprawną datę w JavaScript. Wprowadź rok, miesiąc i dzień, zamień go na datę i sprawdź, czy ta data pasuje do wprowadzonego przez Ciebie tekstu, zamiast do pewnego dnia w marcu.

function isDate(y, m, d) { 
    var a = new Date(y, m-1, d); 
    // subtract 1 from the month since .getMonth() is zero-indexed. 
    if (a.getFullYear() == y && a.getMonth() == m-1 && a.getDate() == d) { 
     return true; 
    } else { 
     return false; 
    } 
} 

Technicznie jest to vanilla JavaScript, ponieważ jQuery tak naprawdę nie rozwija się na macierzystym obiekcie Date.

Powiązane problemy