Подтвердить что ты не робот

Как определить, соответствует ли данная строка дате?

Есть ли функция isDate в jQuery?

Он должен возвращать true, если ввод - это дата, а false в противном случае.

4b9b3361

Ответ 2

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

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

ОБНОВЛЕНИЕ:   Главное предостережение!
 @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 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..

Ответ 3

Нет встроенных функций даты в ядре jQuery... и на самом деле ничего не помогает напрямую с датами, поэтому на нем не так много библиотек (если только они не выбрали дату и т.д.)). Доступно несколько библиотек дат JavaScript, хотя, чтобы упростить работу с ними.

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

Ответ 4

Простейший способ в javascript:

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

Ответ 5

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

Вам нужно указать в своем валидаторе, если даты предшествуют месяцам.

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

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

Ответ 6

Date.parse поможет вам разобраться без необходимости jquery:

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

Above removed after some kind soul pointed out how basic parseDate really is.

Выше удалено после того, как какая-то добрая душа указала, каков на самом деле базовый parseDate. В плагине JQuery UI Datepicker есть также служебная функция $.datepicker.parseDate( format, value, options ):

https://api.jqueryui.com/datepicker/

Ответ 7

Проблема заключается в том, что ввод 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.

Ответ 8

Если вы не хотите использовать плагин 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
}

Ответ 9

Я пришел к этому решению, усложнился, поскольку я использую европейский формат, а 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, не проверили его ни на что другое.)

Ответ 10

Я думаю, вы хотите что-то подобное. +1, если это работает для вас.

HTML

 Date : <input type="text" id="txtDate" /> (mm/dd/yyyy)
 <br/><br/><br/>
<input type="button" value="ValidateDate" id="btnSubmit"/>

JQuery

$(function() {
$('#btnSubmit').bind('click', function(){
    var txtVal =  $('#txtDate').val();
    if(isDate(txtVal))
        alert('Valid Date');
    else
        alert('Invalid Date');
});

function isDate(txtDate)
{
var currVal = txtDate;
if(currVal == '')
    return false;

var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; //Declare Regex
var dtArray = currVal.match(rxDatePattern); // is format OK?

if (dtArray == null) 
    return false;

//Checks for mm/dd/yyyy format.
dtMonth = dtArray[1];
dtDay= dtArray[3];
dtYear = dtArray[5];        

if (dtMonth < 1 || dtMonth > 12) 
    return false;
else if (dtDay < 1 || dtDay> 31) 
    return false;
else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31) 
    return false;
else if (dtMonth == 2) 
{
    var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
    if (dtDay> 29 || (dtDay ==29 && !isleap)) 
            return false;
}
return true;
}

});

CSS

body{
font-family:Tahoma;
font-size : 8pt;
padding-left:10px;
}
input[type="text"]
{
font-family:Tahoma;
font-size : 8pt;
width:150px;
}

DEMO

Ответ 11

Вы должны использовать moment.js, это лучшая библиотека для обработки всех видов дат. Решение вашей проблемы:

var inputVal = '2012-05-25';
moment(inputVal , 'YYYY-MM-DD', true).isValid();