Обнаружение & ldquo; неверной даты & rdquo; Дата экземпляра в JavaScript

Вы проверили исходный код Tomcat и источник JVM? Это может дать вам больше помощи.

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

1302
задан Servy 5 July 2016 в 19:34
поделиться

14 ответов

Вот как бы я это сделал:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

Обновление [2018-05-31] : если вас не интересуют объекты Date из других контекстов JS (внешние окна, фреймы, или iframe), может быть предпочтительна эта более простая форма:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}
1202
ответ дан 19 December 2019 в 20:14
поделиться
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
ответ дан Dhayalan 5 July 2016 в 19:34
поделиться

Подумайте об использовании moment.js, если вы уже знакомы с его использованием. Он предоставляет метод isValid (), который возвращает false для недопустимых дат.

var m = moment("2011-10-10T10:20:90");
m.isValid(); // false
m.invalidAt(); // 5 for seconds

Ссылка: https://momentjscom.readthedocs.io/en/latest/moment/01-parsing/15-is-valid/

0
ответ дан Sibasish Mohanty 5 July 2016 в 19:34
поделиться

Здесь уже слишком много сложных ответов, но достаточно простой строки (ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

или даже в ES6:

Date.prototype.isValid = d => !isNaN(Date.parse(d));
12
ответ дан Andrew Morton 5 July 2016 в 19:34
поделиться

кратчайший ответ для проверки действительной даты

if(!isNaN(date.getTime()))
62
ответ дан abhirathore2006 5 July 2016 в 19:34
поделиться

Хотелось бы отметить, что у виджета DatePicker пользовательского интерфейса jQuery есть очень хороший метод утилиты проверки даты, который проверяет формат и действительность (например, даты 01/33/2013 не допускаются).

Даже если вы не хотите использовать виджет datepicker на своей странице в качестве элемента пользовательского интерфейса, вы всегда можете добавить его библиотеку .js на свою страницу и затем вызвать метод validator, передав значение, которое вы хотите проверить в нем. , Чтобы сделать жизнь еще проще, в качестве входных данных используется строка, а не объект JavaScript Date.

См .: http://api.jqueryui.com/datepicker/

. Он не указан как метод, но он есть - как вспомогательная функция. Найдите на странице слово «parsedate», и вы найдете:

$. Datepicker.parseDate (формат, значение, настройки) - извлечение даты из строкового значения в указанном формате.

Пример использования:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(Более подробную информацию о форматах даты можно найти на http://api.jqueryui.com/datepicker/#utility-parseDate )

В приведенном выше примере вы не увидите предупреждающее сообщение, поскольку «01/03/2012» является датой, действующей в календаре, в указанном формате. Однако если вы, например, сделаете 'stringval' равным '13/04/2013', вы получите предупреждающее сообщение, поскольку значение '13/04/2013' недействительно в календаре.

Если переданное строковое значение успешно проанализировано, значением 'testdate' будет объект даты Javascript, представляющий переданное строковое значение. Если нет, это было бы неопределенным.

37
ответ дан T J 5 July 2016 в 19:34
поделиться
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

0
ответ дан Dustin Poissant 5 July 2016 в 19:34
поделиться

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

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 сделает 31.02.2012 в 03.02.2012, что оно недействительно

5
ответ дан John 5 July 2016 в 19:34
поделиться

Вы можете проверить достоверность объекта Date d через

d instanceof Date && isFinite(d)

. Чтобы избежать проблем с кадрами, можно заменить проверку instanceof на

Object.prototype.toString.call(d) === '[object Date]'

Вызов getTime(), как и в , ответ Боргара не нужен, поскольку isNaN() и isFinite() оба неявно преобразуются в число.

100
ответ дан Community 5 July 2016 в 19:34
поделиться

Я объединил лучшие результаты производительности, которые я нашел в ходе этой проверки, если данный объект:

  • является экземпляром даты (эталонный тест здесь )
  • имеет действительная дата ( тест здесь )

Результат следующий:

function isValidDate(input) {
  if(!(input && input.getTimezoneOffset && input.setUTCFullYear))
    return false;

  var time = input.getTime();
  return time === time;
};
3
ответ дан zVictor 5 July 2016 в 19:34
поделиться
// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());
20
ответ дан faridz 5 July 2016 в 19:34
поделиться

Я написал эту функцию. Передайте ему строковый параметр, и он будет определять, является ли это действительной датой или нет, основываясь на этом формате «дд / мм / гггг».

вот тест

вход: «хахаха», выход: ложь.

вход: «29/2/2000», выход: true.

вход: «29/2/2001», выход: ложь.

function isValidDate(str) {
    var parts = str.split('/');
    if (parts.length < 3)
        return false;
    else {
        var day = parseInt(parts[0]);
        var month = parseInt(parts[1]);
        var year = parseInt(parts[2]);
        if (isNaN(day) || isNaN(month) || isNaN(year)) {
            return false;
        }
        if (day < 1 || year < 1)
            return false;
        if(month>12||month<1)
            return false;
        if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
            return false;
        if ((month == 4 || month == 6 || month == 9 || month == 11 ) && day > 30)
            return false;
        if (month == 2) {
            if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0 && (year % 100) == 0)) {
                if (day > 29)
                    return false;
            } else {
                if (day > 28)
                    return false;
            }      
        }
        return true;
    }
}
4
ответ дан Yaseen 5 July 2016 в 19:34
поделиться

Отличное решение! Включено в мою библиотеку вспомогательных функций, теперь это выглядит так:

Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.prototype.toString.call(obj) === '[object Date]';
}

Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.isDate(obj) && !isNaN(obj.getTime());
}
9
ответ дан Dmytro Shevchenko 5 July 2016 в 19:34
поделиться

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

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

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

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

246
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: