Обнаружение «недопустимой даты» экземпляра Date в JavaScript - PullRequest
1284 голосов
/ 30 августа 2009

Я бы хотел сказать разницу между действительными и недействительными объектами даты в 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 , и это поведение в стандарте, что именно то, что я ищу.

Ответы [ 40 ]

1 голос
/ 19 июня 2019

Простое и элегантное решение:

const date = new Date(`${year}-${month}-${day} 00:00`)
const isValidDate = (Boolean(+date) && date.getDate() == day)

источники:

[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c

[2] Неправильная дата отображается в новой дате () в JavaScript

1 голос
/ 15 июля 2018

Date.prototype.toISOString выбрасывает RangeError (по крайней мере, в Chromium и Firefox) в недействительные даты. Вы можете использовать его как средство проверки, и вам может не потребоваться isValidDate как таковое (EAFP). В противном случае это:

function isValidDate(d)
{
  try
  {
    d.toISOString();
    return true;
  }
  catch(ex)
  {
    return false;    
  }    
}
1 голос
/ 07 ноября 2018

Я видел некоторые ответы, которые очень близко подошли к этому маленькому фрагменту.

Путь JavaScript:

function isValidDate(dateString){ return new Date(dateString).toString() !== 'Invalid Date'; }
isValidDate(new Date('WTH'));

Печатный способ:

const isValidDate = dateString => new Date(dateString).toString() !== 'Invalid Date';
isValidDate(new Date('WTH'));
1 голос
/ 25 апреля 2017

Поэтому мне понравился ответ @Ask Clarke с небольшим улучшением, добавив блок try catch для дат, которые не могут пройти через var d = new Date (d) -

function checkIfDateNotValid(d) {
        try{
            var d = new Date(d);
            return !(d.getTime() === d.getTime()); //NAN is the only type which is not equal to itself.
        }catch (e){
            return true;
        }

    }
0 голосов
/ 16 января 2014
var isDate_ = function(input) {
        var status = false;
        if (!input || input.length <= 0) {
          status = false;
        } else {
          var result = new Date(input);
          if (result == 'Invalid Date') {
            status = false;
          } else {
            status = true;
          }
        }
        return status;
      }
0 голосов
/ 02 января 2019

Еще один способ проверить, является ли дата действительным объектом даты:

const isValidDate = (date) => 
  typeof date === 'object' && 
  typeof date.getTime === 'function' && 
  !isNaN(date.getTime())
0 голосов
/ 25 августа 2014

Эта функция проверяет строковую дату в цифровых форматах, разделенных символом, например, дд / мм / гггг, мм / дд / гггг

/*
Param  : 
1)the date in string data type 
2)[optional - string - default is "/"] the date delimiter, most likely "/" or "-"
3)[optional - int - default is 0] the position of the day component when the date string is broken up via the String.split function (into arrays)
4)[optional - int - default is 1] the position of the month component when the date string is broken up via the String.split function (into arrays)
5)[optional - int - default is 2] the position of the year component when the date string is broken up via the String.split function (into arrays)

Return : a javascript date is returned if the params are OK else null
*/
function IsValidDate(strDate, strDelimiter, iDayPosInArray, iMonthPosInArray, iYearPosInArray) {
    var strDateArr; //a string array to hold constituents day, month, and year components
    var dtDate; //our internal converted date
    var iDay, iMonth, iYear;


    //sanity check 
    //no integer checks are performed on day, month, and year tokens as parsing them below will result in NaN if they're invalid
    if (null == strDate || typeof strDate != "string")
        return null;

    //defaults
    strDelimiter = strDelimiter || "/";
    iDayPosInArray = undefined == iDayPosInArray ? 0 : iDayPosInArray;
    iMonthPosInArray = undefined == iMonthPosInArray ? 1 : iMonthPosInArray;
    iYearPosInArray = undefined == iYearPosInArray ? 2 : iYearPosInArray;

    strDateArr = strDate.split(strDelimiter);

    iDay = parseInt(strDateArr[iDayPosInArray],10);
    iMonth = parseInt(strDateArr[iMonthPosInArray],10) - 1; // Note: months are 0-based
    iYear = parseInt(strDateArr[iYearPosInArray],10);

    dtDate = new Date(
        iYear,
        iMonth, // Note: months are 0-based
        iDay);

    return (!isNaN(dtDate) && dtDate.getFullYear() == iYear && dtDate.getMonth() == iMonth && dtDate.getDate() == iDay) ? dtDate : null; // Note: months are 0-based
}

Пример вызова:

var strDate="18-01-1971";

if (null == IsValidDate(strDate)) {

  alert("invalid date");
}
0 голосов
/ 31 марта 2017

date.parse(valueToBeTested) > 0 это все, что нужно. Допустимая дата вернет значение эпохи, а недопустимое значение вернет NaN, который не пройдёт > 0 проверку, поскольку даже не является числом.

Это так просто, что вспомогательная функция не будет сохранять код, хотя она может быть немного более читабельной. Если вы хотели один:

String.prototype.isDate = function() {
  return !Number.isNaN(Date.parse(this));
}

OR

Для использования:

"StringToTest".isDate();
0 голосов
/ 17 ноября 2015

Этот вариант isValidDate использует регулярное выражение, которое обрабатывает високосные годы:

function isValidDate(value)
{
    return /((^(10|12|0?[13578])([/])(3[01]|[12][0-9]|0?[1-9])([/])((1[8-9]\d{2})|([2-9]\d{3}))$)|(^(11|0?[469])([/])(30|[12][0-9]|0?[1-9])([/])((1[8-9]\d{2})|([2-9]\d{3}))$)|(^(0?2)([/])(2[0-8]|1[0-9]|0?[1-9])([/])((1[8-9]\d{2})|([2-9]\d{3}))$)|(^(0?2)([/])(29)([/])([2468][048]00)$)|(^(0?2)([/])(29)([/])([3579][26]00)$)|(^(0?2)([/])(29)([/])([1][89][0][48])$)|(^(0?2)([/])(29)([/])([2-9][0-9][0][48])$)|(^(0?2)([/])(29)([/])([1][89][2468][048])$)|(^(0?2)([/])(29)([/])([2-9][0-9][2468][048])$)|(^(0?2)([/])(29)([/])([1][89][13579][26])$)|(^(0?2)([/])(29)([/])([2-9][0-9][13579][26])$))/.test(value)
}
0 голосов
/ 20 ноября 2016
Date.valid = function(str){
  var d = new Date(str);
  return (Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()));
}

https://gist.github.com/dustinpoissant/b83750d8671f10c414b346b16e290ecf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...