date сравнение js - Обнаружение экземпляра даты «недействительной даты» в JavaScript



15 Answers

Вместо использования new Date() вы должны использовать:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse() возвращает метку времени, целое число, представляющее количество миллисекунд с 01 января / 1970. Он вернет NaN если он не сможет разобрать предоставленную строку даты.

to string invalid

Я хотел бы рассказать разницу между действительными и недопустимыми объектами даты в JS, но не мог понять, как:

var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'

Любые идеи для написания функции isValidDate ?

  • Пепел рекомендовал Date.parse для синтаксического анализа строк даты, что дает авторитетный способ проверить правильность строки даты.
  • Я бы предпочел, если это возможно, заставить мой API принять экземпляр Date и проверить / подтвердить, является ли он действительным или нет. Решение Borgar делает это, но мне нужно проверить его в браузерах. Я также задаюсь вопросом, есть ли более элегантный способ.
  • Эш заставил меня подумать о том, что мой API не принимает экземпляры Date вообще, это было бы проще всего проверить.
  • Боргар предложил провести тестирование экземпляра Date , а затем проверить значение времени Date . Если дата недействительна, значением времени является NaN . Я проверил с ECMA-262 и это поведение находится в стандарте, и это именно то, что я ищу.



Мое решение состоит в том, чтобы просто проверить, есть ли у вас действительный объект даты:

Реализация

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

использование

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true



Вы можете просто использовать moment.js

Вот пример:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

Раздел проверки в документации достаточно ясен.

Кроме того, следующие флаги разбора приводят к недопустимой дате:

  • overflow : переполнение поля даты, например, 13-й месяц, 32-й день месяца (или 29 февраля в непиковые годы), 367-й день года и т. д. переполнение содержит индекс недействительного единица соответствует #invalidAt (см. ниже); -1 означает отсутствие переполнения.
  • invalidMonth : Недействительное имя месяца, например, момент ('Marbruary', 'MMMM') ;. Содержит недействительную строку месяца, а также значение null.
  • empty : входная строка, которая не содержит ничего разборного, например момент («это вздор») ;. Boolean.
  • И т.п.

Источник: http://momentjs.com/docs/




Мне очень понравился подход Кристофа (но не хватило репутации, чтобы его проголосовать). Для моего использования я знаю, что у меня всегда будет объект Date, поэтому я просто добавил дату с помощью метода valid ().

Date.prototype.valid = function() {
  return isFinite(this);
}

Теперь я могу просто написать это, и это гораздо более описательно, чем просто проверка isFinite в коде ...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }



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

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

Для получения дополнительной информации см. Дата проверки в javascript




вы можете проверить действительный формат txDate.value с этой обрезкой. если он был в некорректном формате, то Date obejct не задан и возвращает значение null в dt.

 var dt = new Date(txtDate.value)
 if (isNaN(dt))

И как @ MiF предложил в короткие сроки

 if(isNaN(new Date(...)))



Для проектов Angular.js вы можете использовать:

angular.isDate(myDate);



Ни одно из вышеперечисленных решений для меня не помогло,

function validDate (d) {
        var date = new Date(d);
        var day = ""+date.getDate();
        if( day.length == 1)day = "0"+day;
        var month = "" +( date.getMonth() + 1);
        if( month.length == 1)month = "0"+month;
        var year = "" + date.getFullYear();

        return ((month + "/" + day + "/" + year) == d);
    }

приведенный выше код будет видеть, когда JS делает 02/31/2012 по 03/02/2012, что его недействительно




Ни один из этих ответов не работал для меня (проверен в Safari 6.0) при попытке подтвердить дату, такую ​​как 2/31/2012, однако они отлично работают при попытке любой даты, превышающей 31.

Поэтому мне пришлось немного переборщить. Предполагая, что дата указана в формате mm/dd/yyyy . Я использую @broox ответ:

Date.prototype.valid = function() {
    return isFinite(this);
}    

function validStringDate(value){
    var d = new Date(value);
    return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}

validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false



Вдохновленный подходом Боргара, я убедился, что код не только проверяет дату, но фактически гарантирует, что дата является реальной датой, что означает, что даты 31/09/2011 и 29/02/2011 не допускаются.

function(dateStr) {
    s = dateStr.split('/');
    d = new Date(+s[2], s[1]-1, +s[0]);
    if (Object.prototype.toString.call(d) === "[object Date]") {
        if (!isNaN(d.getTime()) && d.getDate() == s[0] && 
            d.getMonth() == (s[1] - 1)) {
            return true;
        }
    }
    return "Invalid date!";
}



Объект Date to string - это более простой и надежный способ определить, являются ли оба поля действительной датой. например, если вы введете это «-------» в поле ввода даты. Некоторые из вышеперечисленных ответов не будут работать.

jQuery.validator.addMethod("greaterThan", 

    function(value, element, params) {
        var startDate = new Date($(params).val());
        var endDate = new Date(value);

        if(startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {
            return false;
        } else {
            return endDate > startDate;
        }
    },'Must be greater than {0}.');



Выбранный ответ превосходный, и я его тоже использую. Однако, если вы ищете способ подтверждения ввода даты пользователя, вы должны знать, что объект Date очень устойчив в отношении того, что может показаться недопустимыми аргументами построения в действительные. Следующий единичный тестовый код иллюстрирует точку:

QUnit.test( "valid date test", function( assert ) {
  //The following are counter-examples showing how the Date object will 
  //wrangle several 'bad' dates into a valid date anyway
  assert.equal(isValidDate(new Date(1980, 12, 15)), true);
  d = new Date();
  d.setFullYear(1980);
  d.setMonth(1);
  d.setDate(33);
  assert.equal(isValidDate(d), true);
  assert.equal(isValidDate(new Date(1980, 100, 150)), true);
  //If you go to this exterme, then the checker will fail
  assert.equal(isValidDate(new Date("This is junk")), false);
  //This is a valid date string
  assert.equal(isValidDate(new Date("November 17, 1989")), true);
  //but is this?
  assert.equal(isValidDate(new Date("November 35, 1989")), false);  
  //Ha!  It's not.  So, the secret to working with this version of 
  //isValidDate is to pass in dates as text strings... Hooboy
  //alert(d.toString());
});



Готовая функция, основанная на наивысшем рейтинге:

  /**
   * Check if date exists and is valid.
   *
   * @param {String} dateString Date in YYYY-mm-dd format.
   */
  function isValidDate(dateString) {
  var isValid = false;
  var date;

  date =
    new Date(
      dateString);

  if (
    Object.prototype.toString.call(
      date) === "[object Date]") {

    if (isNaN(date.getTime())) {

      // Date is unreal.

    } else {
      // Date is real if month and day match each other in date and string (otherwise may be shifted):
      isValid =
        date.getUTCMonth() + 1 === dateString.split("-")[1] * 1 &&
        date.getUTCDate() === dateString.split("-")[2] * 1;
    }
  } else {
    // It's not a date.
  }

  return isValid;
}



Для компонент на основе 1-й даты:

var is_valid_date = function(year, month, day) {
    var d = new Date(year, month - 1, day);
    return d.getFullYear() === year && (d.getMonth() + 1) === month && d.getDate() === day
};

тесты:

    is_valid_date(2013, 02, 28)
&&  is_valid_date(2016, 02, 29)
&& !is_valid_date(2013, 02, 29)
&& !is_valid_date(0000, 00, 00)
&& !is_valid_date(2013, 14, 01)



function isValidDate(date) {
  return !! (Object.prototype.toString.call(date) === "[object Date]" && +date);
}





Related