Проверьте, является ли строка значением даты



что это простой способ проверить, если значение является допустимой датой, любой известный формат даты допускается.



например, у меня есть значения 10-11-2009,10/11/2009,2009-11-10T07:00:00+0000 которые все должны быть распознаны как значения даты, а значения 200,10,350, который не должен быть распознан как значение даты. Что это самый простой способ проверить это, если это вообще возможно? Потому что метки времени также будут разрешены.

754   19  

19 ответов:

Would Date.parse() достаточно?

посмотреть его родственник страница документации MDN.

обновление 2015

это старый вопрос, но другие новые вопросы, такие как:

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

большинство ответов здесь или используйте некоторые сложные регулярные выражения, которые соответствуют только некоторым очень конкретным форматам и на самом деле делают это неправильно (например, соответствие 32 января, не совпадая с фактической датой ISO, как объявлено - см. демо)или они пытаются передать что-нибудь Date конструктор и желаю всего наилучшего.

Через Минуту

как я объяснил в ответ в настоящее время библиотеки для этого: момент.js

это библиотека для анализа, проверки, управления и отображения дат в JavaScript, которая имеет гораздо более богатый API, чем стандартные функции обработки дат JavaScript.

это 12kB сжатый/сжатые и работает в узле.JS и другие места:

bower install moment --save # bower
npm install moment --save   # npm
Install-Package Moment.js   # NuGet
spm install moment --save   # spm
meteor add momentjs:moment  # meteor

используя Moment вы можете быть очень конкретным о проверке действительных дат. Иногда очень важно добавить некоторые подсказки о формате, который вы ожидаете. Например, дата, такая как 22.06.2015 выглядит как допустимая дата, Если вы не используете формат DD/MM/YYYY, и в этом случае эта дата должна быть отклонена как недопустимая. Есть несколько способов, как вы можете сказать момент, какой формат вы ожидаете, например:

moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false

The true аргумент есть, поэтому момент не будет пытаться разобрать вход, если он не ровно соответствовать одному из предоставленных форматов (это должно быть поведение по умолчанию на мой взгляд).

вы можете использовать внутренне предоставленный формат:

moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true

и вы можете использовать несколько форматов в качестве массива:

var formats = [
    moment.ISO_8601,
    "MM/DD/YYYY  :)  HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015  :)  13*17*21", formats, true).isValid(); // true
moment("06/22/2015  :(  13*17*21", formats, true).isValid(); // false

посмотреть: демо.

другие библиотеки

если вы не хотите использовать момент.js, есть и другие библиотеки:

обновление 2016

Я создал immoment модуль, который похож на (подмножество) момент, но без сюрпризов, вызванных мутацией существующих объектов (см. документы для получения дополнительной информации).

обновить 2018

сегодня я рекомендую использовать Luxon для манипуляции датой/временем вместо момента, который (в отличие от момента) делает весь объект неизменным, поэтому нет неприятных сюрпризов, связанных с неявной мутацией дат.

Подробнее

посмотреть также:

серия статей Роба Гравелла на JavaScript date parsing libraries:

итог

конечно любой может попробовать изобрести колесо, написать регулярное выражение (но пожалуйста на самом деле читать ISO 8601 и RFC 3339, прежде чем сделать это) или вызвать buit-в конструкторы со случайными данными для разбора сообщений об ошибках, как 'Invalid Date' (вы уверены, что это сообщение точно так же на все платформы? Во всех регионах? В будущем?)или вы можете использовать проверенное решение и использовать свое время, чтобы улучшить его, а не изобретать его. Все библиотеки, перечисленные здесь, являются открытым исходным кодом, свободным программным обеспечением.

вот как я решил эту проблему в приложении, над которым я сейчас работаю:

обновлено на основе обратной связи от krillgar:

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}

или...

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) ) ? true : false;
}

....

new Date(date) === 'Invalid Date' работает только в Firefox и Chrome. IE8 (тот, который у меня есть на моей машине для целей тестирования) дает NaN.

как было указано в принятой ответ, Date.parse(date) также будет работать для чисел. Поэтому, чтобы обойти это, вы также можете проверить, что это не число (если это то, что вы хотите подтвердить).

var parsedDate = Date.parse(date);

// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
    /* do your work */
}

Как насчет чего-то вроде этого? Он будет проверять, является ли это объектом даты или строкой даты:

function = isDate(value) {
  var dateFormat;
  if (toString.call(value) === '[object Date]') {
    return true;
  }
  if (typeof value.replace === 'function') {
    value.replace(/^\s+|\s+$/gm, '');
  }
  dateFormat = /(^\d{1,4}[\.|\/|-]\d{1,2}[\.|\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
  return dateFormat.test(value);
}

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

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

//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy
function isValidDate(s) {
  var separators = ['\.', '\-', '\/'];
  var bits = s.split(new RegExp(separators.join('|'), 'g'));
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1];
} 

вот минималистская версия.

var isDate = function (date) {
    return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}

Я бы сделал это

var myDateStr= new Date("2015/5/2");

if( ! isNaN ( myDateStr.getMonth() )) {
    console.log("Valid date");
}
else {
    console.log("Invalid date");
}

играть здесь

эта вызываемая функция работает отлично, возвращает true для действительной даты. Обязательно звоните, используя дату в формате ISO (гггг-ММ-ДД или гггг/ММ / ДД):

function validateDate(isoDate) {

    if (isNaN(Date.parse(isoDate))) {
        return false;
    } else {
        if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
            return false;
        }
    }
    return true;
}

дата может быть проверена с помощью следующего ответа

 var year=2019;
 var month=2;
 var date=31;
 var d = new Date(year, month - 1, date);
 if (d.getFullYear() != year
    || d.getMonth() != (month - 1)
    || d.getDate() != date) {
alert("invalid date");
return false;
}

можно ли проверить, что функция, связанная с датой, доступна для объекта, чтобы найти, является ли это объектом даты или нет ?

как

var l = new Date();
var isDate = (l.getDate !== undefined) ? true; false;

попробовав все ответы, перечисленные выше, я получил следующее:

var checkDateValue = function(date) {
    return date && (!(new Date(date) == "Invalid Date") && !isNaN(new Date(date)));
};

отметим, что new Date(date) !== "Invalid Date" и всегда правда. Надеюсь, это поможет.

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

function isValidDate(s) {
            var dt = "";
            var bits = [];
            if (s && s.length >= 6) {
                if (s.indexOf("/") > -1) {
                    bits = s.split("/");
                }
                else if (s.indexOf("-") > -1) {
                    bits = s.split("-");
                }
                else if (s.indexOf(".") > -1) {
                    bits = s.split(".");
                }
                try {
                    dt = new Date(bits[2], bits[0] - 1, bits[1]);
                } catch (e) {
                    return false;
                }
                return (dt.getMonth() + 1) === parseInt(bits[0]);
            } else {
                return false;
            }
        }

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой и увидел,что ни один из ответов не работал должным образом - в частности, отсев чисел (1,200,345 и т. д..) из дат, что является исходным вопросом. Вот довольно неортодоксальный метод, который я мог бы придумать, и он, кажется, работает. Пожалуйста, укажите, если есть случаи, когда это не удастся.

if(sDate.toString() == parseInt(sDate).toString()) return false;

это строка для отсеивания чисел. Таким образом, вся функция может выглядеть так:

function isDate(sDate) {  
  if(sDate.toString() == parseInt(sDate).toString()) return false; 
  var tryDate = new Date(sDate);
  return (tryDate && tryDate.toString() != "NaN" && tryDate != "Invalid Date");  
}

console.log("100", isDate(100));
console.log("234", isDate("234"));
console.log("hello", isDate("hello"));
console.log("25 Feb 2018", isDate("25 Feb 2018"));
console.log("2009-11-10T07:00:00+0000", isDate("2009-11-10T07:00:00+0000"));

попробуй такое

<input type="text" id="StartDay" value="2018/01/01" maxlength="10" />

$('#StartDay').change(function () {
    if ( ($('#StartDay').val().length == 10 && new Date($('#StartDay').val()) >= new Date("2018/01/01") &&
        (new Date($('#StartDay').val()) !== "Invalid Date") && !isNaN(new Date($('#StartDay').val()))) == false) {
     .....
    }
})

ссылаясь на все вышеперечисленные комментарии, я пришел к решению.

это работает, если дата передается в формате ISO или нужно манипулировать для других форматов.

var isISO = "2018-08-01T18:30:00.000Z";

if(new Date(isISO) !== "Invalid Date" && !isNaN(new Date(isISO)) ) {
if(isISO==new Date(isISO).toISOString()){
console.log("Valid date");
} else {
    console.log("Invalid date");
    }

}
else {
    console.log("Invalid date");
}`

вы можете играть здесь на JSFiddle

это работает:

var isDate = function(date) {
    return ((new Date(date)).toString() !== "Invalid Date") ? true : false;         
}
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
sdf.setLenient(false);

по умолчанию установлено значение TRUE. Поэтому даже строки неправильного формата возвращают хорошие значения.

я использовал это что-то вроде этого :

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
formatter.setLenient(false);
String value = "1990/13/23"; 

try {
      Date date = formatter.parse(value);
      System.out.println(date);
    }catch (ParseException e) 
  {
    System.out.println("its bad");
  }

попробуйте это:

if (var date = new Date(yourDateString)) {
    // if you get here then you have a valid date       
}

Comments

    Ничего не найдено.