JavaScript에서 "유효하지 않은 날짜"날짜 인스턴스 감지


1493

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로 확인 했는데이 동작은 표준이며 정확히 내가 찾는 것입니다.

18
함수 본문을 다음과 같이 변경하여 if 문을 제거 할 수 있습니다.return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
styfle

3
@ styfle-스타일 환경 설정이라고 생각합니다. 유형 논리와 형식 검사를 분리하는 것이 더 명확합니다.
orip

26
@orip의 담화는 질문에서 크게 낙담 한 것입니다. 그에 대한 근거를 배우려면 관련 메타 주제를 참조하십시오. 질문 자체에 자신의 질문에 대한 답변을 올리는 것은 사이트 정책에 위배됩니다. OTOH, 답변을 요청하고 답변에 "편집"을하는 것이 일반적인 보풀입니다. SO가 무엇인지, 어떻게 사용하는지 모르고 배우기를 원하지 않는 사람으로 당신을 식별하기 위해 최상위 질문을 원한다면-내 손님이 되십시오.

14
@orip : "잃어버린"것이 아닙니다. 질문을 다시보고 싶다면 여전히 질문의 개정 내역을 어지럽히고 있습니다. 그러나 그것은 질문에 속하지 않습니다. 37k 담당자는 이것을 알아야합니다.
궤도에서 가벼움 경주

6
편집 전쟁을 중지하십시오. 이 질문에 대한 편집 내용은 meta에 설명되어 있습니다. 이 게시물을 더 이상 편집 / 롤백하지 마십시오. 이전 편집 / 롤백에 동의하지 않거나 이에 대한 의견이 있으면 여기가 아닌 해당 메타 스레드에 게시하십시오.
Lundin

답변:


1301

내가하는 방법은 다음과 같습니다.

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] : 다른 JS 컨텍스트 (외부 창, 프레임 또는 iframe)의 Date 객체와 관련이없는 경우이 간단한 양식이 선호 될 수 있습니다.

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

21
instanceof는 여러 프레임에서 끊어집니다. 오리 타이핑도 잘 작동합니다. validDate == d && d.getTime &&! isNaN (d.getTime ()); -문제는 일반적인 유틸리티 기능에 대한 것이므로 더 엄격한 것을 선호합니다.
Borgar

11
@Borgar는 방금 내 대답을 찾았습니다. "멀티 프레임 DOM 환경에서 스크립팅 할 때 문제가 발생합니다. 간단히 말해 한 iframe 내에서 생성 된 Array 객체는 다른 iframe 내에서 생성 된 어레이와 [[Prototype]]을 공유하지 않습니다. 그들의 생성자는 다른 객체이므로 instanceof와 생성자 검사는 모두 실패합니다. "
Ash

64
당신은 d.getTime단지 필요하지 않습니다isNan(d)
TecHunter 8:30에

8
다음과 같이 단순화 할 수 있습니다.d instanceof Date && !isNaN(d.getTime())
Zorgatone

5
답변 주셔서 감사하지만 @Borgar 및 @blueprintChris 의견을 강조하고 싶습니다. 1예를 들어 숫자 를 구문 분석하면 여전히 유효한 날짜가 표시되므로 Mon Jan 01 2001 00:00:00실제로는 날짜입니다. 그러나 응용 프로그램의 목적 상 완전히 쓸모가 없습니다. . 따라서 적어도 내 경우에는 더 많은 입력 유효성 검사가 필요합니다. 이 답변 dateObjectDate!
dnhyde

264

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

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

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

Date.parse()01 / Jan / 1970 이후의 밀리 초 수를 나타내는 정수인 타임 스탬프를 반환합니다. NaN제공된 날짜 문자열을 구문 분석 할 수 없으면 리턴 됩니다.


119
-1 Dunno 왜 이것이 많은 투표를했는지, Date.parse구현에 달려 있으며 일반적인 날짜 문자열을 구문 분석하는 것으로 절대 신뢰할 수 없습니다. 널리 사용되는 브라우저에서 올바르게 구문 분석되는 단일 형식은 없으며 사용중인 모든 형식이 훨씬 적습니다 (결국 ES5에 지정된 ISO8601 형식 정상 임 ).
RobG

1
new Date('foo')그것을 사용하면 기본적으로 Date.parse('foo')메소드 와 동일합니다 . 참고 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 따라서 @RobG가 말한 내용에도 적용됩니다.
golddragon007

2
이 테스트는 Chrome에서 실패합니다. 예를 들어 Chrome의 Date.parse ( 'AAA-0001')는 숫자를 제공합니다.
Nick

실패 ... 모든 숫자 값을 감지
Hos Mercury

109

당신은 통해 Date객체 의 유효성을 확인할 수 있습니다d

d instanceof Date && isFinite(d)

교차 프레임 문제를 피하기 위해 instanceof수표를

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

에 대한 호출 getTime()에서와 같이 Borgar의 대답은 같은 불필요 isNaN()하고 isFinite()모두 암시 적으로 숫자로 변환.


크롬에서 이것을 시도하십시오-Object.prototype.toString.call (new Date ( "2013-07-09T19 : 07 : 9Z")). "[개체 날짜]"를 반환합니다. 따라서 "2013-07-09T19 : 07 : 9Z"는 유효한 날짜 여야합니다. 그러나 그렇지 않습니다. var dateStr = new Date ( "2013-07-09T19 : 07 : 9Z")를 수행하여 크롬에서 다시 확인할 수 있습니다. dateStr 유효하지 않은 날짜를 반환합니다.
Tintin

2
@ 틴틴 (Tintin) : 그게 전부 isFinite()입니다- 수표 toString.call()instanceof일부만을 대체합니다
Christoph

영어가 아닌 브라우저에서 '[object Date]'와 (와) 비교할 수 있습니까? 나는 그것을 의심한다.
kristianp

2
@kristianp 실제로는 아마도 ECMAScript 사양의 일부일 것입니다. 그러나 그렇습니다.
binki

나에게 여기에 첫 번째 접근법은 가장 좋은 옵션이지만, isFiniteover 를 사용 하는 것의 실제 이점이 있는지 확실하지 않습니다 isNaN(둘 다 잘 작동합니다 Date(Infinity)). 또한 반대 조건을 원하면 조금 더 간단 해집니다 if (!(date instanceof Date) || isNaN(date)).
Andrew

86

내 솔루션은 유효한 날짜 개체가 있는지 간단히 확인하는 것입니다.

이행

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

28
isNaNNaN을 테스트하는보다 명확한 방법입니다.
orip

1
그럼에도 불구하고 항상 자신의 버전을 작성하는 사람들을 찾을 수 있습니다 :) documentcloud.github.com/underscore/docs/…
Ash Clarke

4
underscore.js를 존중하기 때문에 약간의 연구가 필요했습니다. isNaN("a") === true반면 ("a" !== "a") === false. 생각해 볼 가치가 있습니다. +1
orip

8
여기서 찾은 3 가지 주요 솔루션의 성능을 테스트했습니다. 축하합니다, 당신이 승자입니다! jsperf.com/detecting-an-invalid-date
zVictor

2
@Ali 유효한 날짜 개체입니다. new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time). 문자열을 날짜 생성자로 전달하는 경우 신뢰할 수있는 결과를 얻으려면 표준화 된 문자열을 전달해야합니다. 특히 "문자열은 Date.parse () 메서드에서 인식하는 형식이어야합니다." developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ash Clarke

71

유효한 날짜를 확인하는 가장 짧은 답변

if(!isNaN(date.getTime()))

2
날짜가 날짜 유형이 아닌 경우 유일한 문제점입니다. JS 오류가 발생합니다.
Andrew

@Andrew 당신은 날짜 개체를 만들어야하고 이미 개체가 있다면 다음을 사용하십시오date && !isNaN(date.getTime())
abhirathore2006

dateDate 유형이 아닌 경우 여전히 JS 오류가 발생합니다 . 예를 들면 다음과 같습니다 var date = 4; date && !isNaN(date.getTime());..
Andrew

date instanceof Date && !isNaN(date.getTime())
@Andrew

3
맞아요, 8 년 전의 다른 답변들처럼. : P stackoverflow.com/a/1353945/2321042
Andrew

45

간단히 moment.js 를 사용할 수 있습니다

예를 들면 다음과 같습니다.

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

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

또한 다음 구문 분석 플래그는 유효하지 않은 날짜를 초래합니다.

  • overflow: 13 번째 달, 32 번째 날 (또는 윤년이 아닌 2 월 29 일), 367 번째 날 등의 날짜 필드 오버플로에는 잘못된 단위의 인덱스가 포함됩니다. #invalidAt와 일치합니다 (아래 참조). -1은 오버플로가 없음을 의미합니다.
  • invalidMonth: moment ( 'Marbruary', 'MMMM');과 같은 잘못된 월 이름입니다. 잘못된 월 문자열 자체를 포함하거나 그렇지 않은 경우 널을 포함합니다.
  • empty: moment ( 'this is nonsense');와 같이 구문 분석이 불가능한 입력 문자열. 부울.
  • 기타.

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


6
구현이 매우 쉬운 최고의 솔루션은 모든 형식 (내 경우는 dd / MM / yyyy)에서 작동하며 윤년을 알고 유효하지 않은 날짜 (예 : 29/02/2015)를 자체로 유효한 날짜로 변환하지 않습니다 (예 : 29/02/2015) 30/03/2015). formad dd / MM / yyyy에서 날짜를 확인하려면 방금 사용해야했습니다moment("11/06/1986", "DD/MM/YYYY").isValid();
Rafael Merlin

3
이 순간의 사용은 더 이상 사용되지 않습니다 :(
James Sumners

2
이 사용은 감가 상각되지 않았습니다. 형식 문자열이없는 호출 모멘트 (입력)는 감가 상각됩니다 (입력이 ISO 형식이 아닌 경우).
Chet

2
이 방법은 많은 날짜를 처리 할 때 속도가 매우 느릴 수 있습니다. 이 경우 정규식을 사용하는 것이 좋습니다.
Grid Trekkor

2
moment.js의 사용법은 간단 할 수 있지만 엄청난 오버 헤드입니다. 이 도서관은 거대합니다. 나는 당신의 대답을 downvoted.
Mick

38

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

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

보다: http://api.jqueryui.com/datepicker/

메소드로 표시되지는 않지만 유틸리티 함수로 표시됩니다. "구문 분석"페이지를 검색하면 다음을 찾을 수 있습니다.

$ .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 객체입니다. 그렇지 않으면 정의되지 않은 것입니다.


3
영어 / 로캘이 아닌 날짜 형식으로 작업하는 첫 번째 답변이 된 것에 찬성하십시오.
도끼.

26

나는 Christoph의 접근법을 정말로 좋아했지만 (투표 할만큼 평판이 충분하지 않았습니다). 필자는 항상 Date 객체를 사용하므로 valid () 메서드로 날짜를 연장했습니다.

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

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

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

10
프로토 타입을 확장 하시겠습니까? 큰 자바 스크립트입니다.
Jasdeep Khalsa 2016 년

isFinite나를 위해 완벽하게 일 했기 때문에 공감 . 그러나 예, 프로토 타입을 확장하는 것은 의미가 없습니다. !isFiniteDate있다는 사실을 잡을 것 Date입니다 Invalid Date. 또한 내 맥락은 노드 안에 있습니다.
Staghouse


17

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

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

그리고 @MiF가 짧은 방법으로 제안한 것처럼

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

isNaN (new Date (...))-간단하고 짧은 방법
MiF

1
@MiF 예, 귀하의 제안으로 답변을 업데이트합니다.) 감사합니다
Yuseferi

16

다음 코드를 사용하여 연도, 월 및 날짜의 값을 확인합니다.

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

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


str사용되지 않습니다.
samis

12

여기에 너무 많은 복잡한 답변이 있지만 간단한 줄이면 충분합니다 (ES5).

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

또는 ES6에서도 :

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

1
MDN에서 : "Date.parse () 메소드는 날짜의 문자열 표현을 구문 분석하고 1970 년 1 월 1 일 00:00:00 UTC 또는 NaN 이후의 밀리 초 수를 리턴합니다." 함수는 정수 또는 NaN을 반환합니다. 그런 다음 isNaN () 함수는 원래 값이 유효한 날짜 객체인지 여부를 알려주는 깨끗한 부울을 제공합니다. 이것으로 스폿 검사를하기에 충분하지만, 위의 예제는이 메소드를 Date 객체에 연결하여 프로그램 전체에서 기능을 쉽게 사용할 수 있고 읽을 수있게합니다.
Max Wilder

d가 boolean이면 Nan이 아닌 0 또는 1을 받게됩니다!
davcup

@ davcup 방금 테스트를 사용하여 Date.parse(true)NaN을 올바르게 얻습니다.
Sebastien H.

12

나는이 작은 발췌 문장에 가까운 몇 가지 답변을 보았습니다.

자바 스크립트 방식 :

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

TypeScript 방식 :

const isValidDate = dateObject => new Date(dateObject ).toString() !== 'Invalid Date';
isValidDate(new Date('WTH'));

1
누락 된 것이 있는지 확실하지 않지만 new Date ()를 두 번 의미있게하지 않습니까?
Jon Catmull

2
후자는 TypeScript와 관련없습니다 . 완벽하게 유효한 JS입니다.
hackel

9

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

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

이것은 단지 나를 위해 일했다

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

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

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

5
브라우저에 따라 다릅니다.
barrypicker

@barrypicker 이것이 브라우저에 의존한다는 것은 무엇을 의미합니까?
Ajil O.

당신은 할 수 있습니다 : `${new Date('foo')}` === 'Invalid Date'
다니엘 Vrut

9

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

angular.isDate(myDate);

3
유효하지 않은 날짜로 초기화 된 날짜 개체를 테스트 할 때 true를 반환합니다.
dchhetri

6

이 답변 중 어느 것도 2012 년 2 월 31 일과 같은 날짜의 유효성을 검사하려고 할 때 (Safari 6.0에서 테스트) 나에게 도움이되지 않지만 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

(new Date ( '2/30/2014')). valid () true를 반환
Andre Figueiredo

1
이 답변에 답변 한 후 시간이 && value.split('/')[0] == (d.getMonth()+1);
Dex

사용 new Date('string date')은와 동일합니다 Date.parse('string date'). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…를 참조하십시오. 따라서 거짓 true 또는 false 값을 얻을 수 있습니다.
golddragon007

5

그러나 위의 해결책 중 어느 것도 효과가 없었습니다.

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 월 2 일에 유효하지 않은 것으로 만들 때 볼 수 있습니다


3
그러나 이것은 문자열이 "유효한 날짜 개체와 유효하지 않은 날짜 개체의 차이"가 아닌 M / D / Y 형식의 날짜인지 테스트합니다. 이것이 실제로 문제가되는 것은 아닙니다.
Borgar

형식에 대해 검사 된 이유는 날짜를 구문 분석 한 후 날짜가 변경되었는지 확인하는 것입니다.
John

OP가 형식화 된 문자열이 아닌 부울을 반환하는 방법을 요구하지 않습니까?
barrypicker

1
샘플 코드는 부울을 리턴하며 형식화는 일부 유효하지 않은 케이스를 테스트하는 데 중요한 역할을합니다.
John

5
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;
}

4

이 기능을 작성했습니다. 문자열 매개 변수를 전달하면이 형식 "dd / MM / yyyy"를 기반으로 유효한 날짜인지 여부를 판별합니다.

여기 시험이있다

입력 : "hahaha", 출력 : false.

입력 : "29/2/2000", 출력 : true.

입력 : "29/2/2001", 출력 : false.

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

Date.prototype.toISOString발생 RangeError(크롬과 파이어 폭스에 적어도) 잘못된 날짜에. 이를 검증 수단으로 사용할 수 있으며 필요하지 않을 수도 있습니다 isValidDate(EAFP). 그렇지 않으면 :

function isValidDate(d)
{
  try
  {
    d.toISOString();
    return true;
  }
  catch(ex)
  {
    return false;    
  }    
}

1
ECMA-262 정의에 의해 오류를 발생시키는 유일한 기능인 것 같습니다. 15.9.5.43 Date.prototype.toISOString ()이 함수는이 Date 객체가 나타내는 시간의 인스턴스를 나타내는 문자열 값을 반환합니다. 문자열의 형식은 15.9.1.15에 정의 된 날짜 시간 문자열 형식입니다. 모든 필드는 문자열에 있습니다. 표준 시간대는 항상 UTC이며 접미사 Z로 표시됩니다.이 객체의 시간 값이 유한 숫자가 아닌 경우 RangeError 예외가 발생합니다.
Henry Liu

3

Borgar의 접근 방식에서 영감을 받아 코드가 날짜의 유효성을 검사 할뿐만 아니라 실제로 날짜가 실제 날짜인지 확인했습니다. 즉, 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!";
}

그러나 ... 위의 방법 (@Borgar 및 기타)은 이미이 유형의 유효성을 검사합니다 ... 문제를 해결할 수 없습니다.
푸르스름한

Borgar 's는-자신의 답변에 대한 자신의 의견을 참조하지 않습니다.
EML

1
이 솔루션은 해당 국가에서 dd/MM/yyyy표기법을 사용하는 경우에만 작동합니다 . 또한 true유효 할 때 반환 하고 유효 'Invalid date!'하지 않으면 1 유형 만 반환하는 것이 좋습니다.
A1rPun

3

주어진 객체인지 확인한 결과 최고의 성능 결과를 결합했습니다.

결과는 다음과 같습니다.

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

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

2

Date object 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}.');

2

선택한 답변이 우수하며 사용하고 있습니다. 그러나 사용자 날짜 입력의 유효성을 검사하는 방법을 찾고 있다면 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());
});

2
function isValidDate(strDate) {
    var myDateStr= new Date(strDate);
    if( ! isNaN ( myDateStr.getMonth() ) ) {
       return true;
    }
    return false;
}

이렇게 불러

isValidDate(""2015/5/2""); // => true
isValidDate(""2015/5/2a""); // => false

2

최고 등급의 답변을 기반으로 준비된 기능 :

  /**
   * 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;
}

2

간단하고 우아한 솔루션 :

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에서 new Date ()에 잘못된 날짜가 표시됨


1
date.getDate() == day날짜가 유효한지 판단하기에 충분하지 않습니다. 원래 날짜 형식은 날짜가 유효한지 여부에 관계없이 일부 구현에서 유효하지 않은 날짜를 반환합니다. 또한 올바르게 구문 분석 된 경우 "1970-01-01 00:00" Boolean(+new Date("1970-01-01"))은 false를 반환합니다 (즉, false를 반환 함).
RobG

경고 : Safari
Vigrant

형식을 사용하면 Safari에서 작동합니다. const date = new Date(year, month, day); 이 방법으로 월은 0으로 색인화되므로 1을 빼서 올바르게 정렬해야 할 수 있습니다.
Vigrant

1

나는 이것의 일부가 긴 과정이라고 생각한다. 아래와 같이 짧게 줄일 수 있습니다.

 function isValidDate(dateString) {
        debugger;
        var dateStringSplit;
        var formatDate;

        if (dateString.length >= 8 && dateString.length<=10) {
            try {
                dateStringSplit = dateString.split('/');
                var date = new Date();
                date.setYear(parseInt(dateStringSplit[2]), 10);
                date.setMonth(parseInt(dateStringSplit[0], 10) - 1);
                date.setDate(parseInt(dateStringSplit[1], 10));

                if (date.getYear() == parseInt(dateStringSplit[2],10) && date.getMonth()+1 == parseInt(dateStringSplit[0],10) && date.getDate() == parseInt(dateStringSplit[1],10)) {
                    return true;
                }
                else {
                    return false;
                }

            } catch (e) {
                return false;
            }
        }
        return false;
    }

3
이 질문은 문자열이 아닌 잘못된 Date 인스턴스를 찾는 방법과 슬래시 이외의 다른 날짜로 날짜를 구분할 수 없다고 누가 물었습니다.
Jon z

1

날짜의 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.