2010-10-07 3 views

ответ

5

В зависимости от того, как вы пытаетесь осуществить это, вы можете быть в состоянии использовать the "validate" jQuery plugin с the date option набором.

+0

это не подтверждает европейский формат даты (дд/ММ/гггг) – armen

0

Date.parse будет PRB-то вам, без необходимости JQuery:

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

Выше удалены после того, как какая-то душа указал, как основной parseDate на самом деле.

Существует также метод «parseDate» в плагин JQuery UI Datepicker:

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

+0

var d = Date.parse ("13/13/2010"); ДАЖЕ 1294857000000 :) ТАК ЭТО НЕ БУДЕТ ИСПОЛЬЗОВАНО –

+0

О, ничего себе, это отстой! Я думал, что это правильно сказал вам, была ли дата действительной. –

4

В ядре jQuery нет встроенных функций даты, и на самом деле это не делает ничего, чтобы помочь с датами, поэтому на нем не так много библиотек (если только они не выбрали дату, и т.д). There are several JavaScript date libraries available though, чтобы упростить работу с ними.

Я не могу точно ответить, что лучше ... это зависит от того, как они входят в него и с какой культурой вы имеете дело, помните, что разные культуры используются, чтобы видеть их даты в другом формате, так как быстрый пример, MM/DD/YYYY vs YYYY/MM/DD (или десятки других).

2

Лучший способ получить ввод данных пользователя - это выбор даты, который предоставляет только действительные даты. Это может быть сделано с помощью строки, но вы можете уничтожить своих пользователей, потребовав, чтобы они использовали ваш выбранный формат.

Необходимо указать в своем валидаторе, если даты предшествуют месяцам.

Для этого используется второй аргумент. Без второго аргумента он использует заказ по умолчанию для компьютера.

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

позволяют названия месяцев, а также цифры: '21 января 2000' или „Октябрь 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

Если вы не хотите использовать JQuery плагин я нашел функцию по адресу:

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

работает для меня. Остальные, которые я нашел, работают не так хорошо.

ОБНОВЛЕНО:

Из кешированной версии страницы по адресу: 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

Ссылка не работает. –

32

Если вы не хотите иметь дело с внешними библиотеками, простой Javascript только раствор:

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

ОБНОВЛЕНИЕ:       !! Major Caveat !!
@BarryPicker поднимает хороший момент в комментариях. JavaScript беззвучно преобразует 29 февраля - 1 марта за все непиковые годы. Такое поведение, по-видимому, ограничено только днями до 31 года (например, 32 марта не конвертируется в 1 апреля, но 31 июня конвертируется в 1 июля). В зависимости от ситуации, это может быть ограничением вы можете принять, но вы должны знать об этом:

>>> 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

для asp.net, если вы используете элемент управления CustomValidator, который вы можете вызвать из свойства ClientValidationFunction, эта функция должна быть более или менее: функция IsDate (отправитель, args) { 10 var d = new Дата ($ ('# tbBirthDate «) .val()); args.IsValid =! IsNaN (d.valueOf()); возвращение; } – juanytuweb

+1

Этот метод не работает правильно для 29/24/2014 - не было високосного года на 2014 год.Фактически, этот метод говорит, что 2/30/2014 действителен - и это никогда не будет действительным. При использовании 2/30/2014 в качестве ввода переменной 'd' присваивается значение 2 марта 2014 года в первой строке вашей функции, поэтому происходит некоторое неявное преобразование ... – barrypicker

+0

@barrypicker: Спасибо, вверх. Я обновил свой ответ соответственно. – mwolfe02

0

Я пришел к этому решению, сделать более сложным, как я использую европейский формат и Javascript явно американская!

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 = ""; 
} 

Беспощадно, но выполняет эту работу. Если ваши пользователи америки и положили день посередине (что я никогда не пойму!), То вы можете оставить раздел и создать новый D.

Вполне вероятно, что я могу переопределить американское поведение по умолчанию в JS, установив культуру или некоторые из них, но моя целевая аудитория - исключительно европейская, так что было проще выстроить ее таким образом. (. О, это работает в Chrome, не проверял его на что-нибудь еще)

+0

Не работает в ie! (т. е. преобразует его в совершенно другую действительную дату!) Я собирался преобразовать функцию C, которую я написал для встроенного программного обеспечения, которое проверяет день в соответствии с месяцем, но я думал, что мне нужно было делать такие вещи низкого уровня в моей дневной работе ! У них есть дампикер, я проверю его на стороне сервера с помощью VB isdate. Работа выполнена. – user2981217

2

простой способ в JavaScript является:

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

Проблема заключается в том, что ввод в 31 февраля возвращает действительную дату в JavaScript. Введите год, месяц и день, превратите его в дату и посмотрите, соответствует ли эта дата тому, что вы вводили, а не в какой-то день в марте.

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; 
    } 
} 

Технически это ваниль JavaScript, так как JQuery не действительно расширить на родной объект Date.