연산 - JavaScript의 "잘못된 날짜"날짜 인스턴스 감지




javascript datetime format (20)

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 함수 작성에 대한 아이디어가 있습니까?

  • Ash는 날짜 문자열의 구문 분석에 Date.parse 를 권장했습니다. 날짜 문자열이 유효한지 확인할 수있는 권위있는 방법을 제공합니다.
  • 가능한 경우, 내 API가 Date 인스턴스를 허용하고 유효한지 여부를 확인 / 주장 할 수 있도록하는 것이 좋습니다. Borgar의 솔루션은 그렇게하지만 브라우저에서 테스트해야합니다. 나는 또한 더 우아한 방법이 있는지 궁금해.
  • 애쉬 (Ash)는 내 API가 Date 인스턴스를 받아들이지 않는 것을 고려해 보았습니다. 유효성 검사가 가장 쉽습니다.
  • Borgar는 Date 인스턴스에 대한 테스트를 제안한 다음 Date 의 시간 값을 테스트했습니다. 날짜가 유효하지 않은 경우 시간 값은 NaN 입니다. 나는 ECMA-262 점검했고,이 행동은 내가 찾고있는 것과 정확히 일치하는 표준에있다.

moment.js 사용할 수 있습니다 moment.js

다음은 그 예입니다.

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

문서의 유효성 검사 섹션 은 매우 명확합니다.

또한 다음 구문 분석 플래그로 인해 잘못된 날짜가 발생합니다.

  • overflow : 13 일, 32 일 (또는 비 윤년 인 경우 2 월 29 일), 367 일 등의 오버플로는 오버플로가 유효하지 않은 항목의 인덱스를 포함합니다. #invalidAt와 일치하는 단위 (아래 참조). -1은 오버플로 없음을 의미합니다.
  • invalidMonth : 잘못된 월 이름 (예 : 'Marbruary', 'MMMM'); 유효하지 않은 월 문자열 자체 또는 null을 포함합니다.
  • empty : 모멘트 ( 'this is nonsense')와 같이 구문 분석 할 수있는 것도 포함하지 않은 입력 문자열. Boolean.
  • 기타.

출처 : http://momentjs.com/docs/


Angular.js 프로젝트의 경우 다음을 사용할 수 있습니다.

angular.isDate(myDate);

jQuery UI DatePicker 위젯에는 형식과 유효성을 확인하는 매우 좋은 날짜 유효성 검사 유틸리티 메소드가 있습니다 (예 : 01/33/2013 날짜는 허용되지 않음).

페이지에서 datepicker 위젯을 UI 요소로 사용하지 않으려는 경우에도 페이지에 .js 라이브러리를 추가 한 다음 유효성 검사기 메서드를 호출하여 유효성 검사 할 값을 전달할 수 있습니다. 삶을 더 편하게하기 위해 JavaScript Date 객체가 아니라 문자열을 입력으로 사용합니다.

참조 : http://api.jqueryui.com/datepicker/

그것은 방법으로 나열되어 있지는 않지만 유틸리티 기능으로 존재합니다. 페이지에서 "parsedate"를 검색하면 다음을 찾을 수 있습니다.

$ .datepicker.parseDate (format, value, settings) - 지정된 형식의 문자열 값에서 날짜를 추출합니다.

사용 예 :

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 Date 객체가됩니다. 그렇지 않으면 정의되지 않습니다.


via Date 객체의 유효성을 확인할 수 있습니다.

d instanceof Date && isFinite(d)

프레임 간 문제를 피하기 위해 instanceof 수표를 다음으로 대체 할 수 있습니다.

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

isNaN()isFinite() 모두 숫자로 암시 적으로 변환되므로 Borgar의 대답 과 마찬가지로 getTime() 을 호출 할 필요가 없습니다.


날짜와 시간을 밀리 초로 변환 할 수 있습니다. getTime()

getTime() 메서드는 유효하지 않은 숫자가 아닌 NaN 합니다.

if(!isNaN(new Date("2012/25/255").getTime()))
  return 'valid date time';
  return 'Not a valid date time';

날짜의 int 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 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;
}

자세한 내용 은 자바 스크립트에서 날짜 확인을 참조하십시오.


문자열에 대한 Date 객체는 두 필드가 유효한 날짜인지를보다 간단하고 신뢰할 수있는 방법으로 감지합니다. 예 : 날짜 입력 필드에 "-------"을 입력 한 경우. 위의 답변 중 일부는 작동하지 않습니다.

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());
});

위의 솔루션 중 어느 것도 작동하지 않았지만

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가 2012 년 2 월 31 일을 2012 년 3 월 3 일로 잘못 설정할 때 표시됩니다.


이 scirpt로 txDate.value의 유효한 형식을 확인할 수 있습니다. 올바르지 않은 형식 인 경우 Date는 인스턴스화되지 않았으며 dt에 null을 반환합니다.

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

그리고 @ MiF가 짧은 방법으로 제안했듯이

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

이 답변 중 2/31/2012와 같은 날짜의 유효성을 검사 할 때 사파리 6.0에서 테스트 한 답변이 없었지만 31보다 큰 날짜를 사용해도 제대로 작동합니다.

그래서 나는 약간의 무력을 기울여야했다. 날짜가 mm/dd/yyyy 형식이라고 가정합니다. @ 브룩스 대답을 사용하고 있습니다 :

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

이것은 나를 위해 일했습니다.

new Date('foo') == 'Invalid Date'; //is true

그러나 이것은 작동하지 않았다.

new Date('foo') === 'Invalid Date'; //is false

이미 복잡한 답변이 너무 많습니다 만 간단한 회선으로 충분합니다 (ES5).

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

또는 심지어 ES6에서 :

Date.prototype.isValid = d => !isNaN(Date.parse(d));

좋은 해결책! 내 보조 기능 라이브러리에 포함되어 이제 다음과 같이 보입니다.

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());
}

주어진 객체가 다음과 같은 경우 해당 체크를 통해 가장 좋은 성능 결과를 얻었습니다.

결과는 다음과 같습니다.

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

  var time = input.getTime();
  return time === time;
};

크리스토프의 접근 방식이 정말 마음에 들었습니다 (하지만 투표권이 충분하지 못했습니다). 내 사용을 위해, 나는 항상 Date 객체를 가질 것이므로 valid () 메서드로 날짜를 확장했다.

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

이제이 코드를 작성할 수 있으며 코드에서 isFinite를 확인하는 것보다 훨씬 설명력이 좋습니다 ...

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

new Date() 를 사용하는 대신 다음을 사용해야합니다.

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

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

Date.parse() 는 1970 년 1 월 1 일 이후의 밀리 초 수를 나타내는 정수인 타임 스탬프를 반환합니다. 제공된 날짜 문자열을 구문 분석 할 수없는 경우 NaN 을 반환합니다.


// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

IsValidDate: function(date) {
        var regex = /\d{1,2}\/\d{1,2}\/\d{4}/;
        if (!regex.test(date)) return false;
        var day = Number(date.split("/")[1]);
        date = new Date(date);
        if (date && date.getDate() != day) return false;
        return true;
}




date