질문자 :orip
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
인스턴스를 전혀 허용하지 않는 것을 고려하도록 했습니다. 이것이 가장 검증하기 쉬울 것입니다. -
Date
인스턴스를 테스트한 다음 Date
의 시간 값을 테스트할 것을 제안했습니다. 날짜가 유효하지 않은 경우 시간 값은 NaN
입니다. ECMA-262로 확인했는데 이 동작이 표준에 있으며, 이것이 바로 제가 찾고 있는 것입니다.
내가 할 방법은 다음과 같습니다.
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); }
Borgarnew Date()
를 사용하는 대신 다음을 사용해야 합니다.
var timestamp = Date.parse('foo'); if (isNaN(timestamp) == false) { var d = new Date(timestamp); }
Date.parse()
는 1970년 1월 1일 이후의 밀리초 수를 나타내는 정수인 타임스탬프를 반환합니다. 제공된 날짜 문자열을 구문 분석할 수 없으면 NaN
을 반환합니다.
Ash다음을 통해 Date
객체 d
의 유효성을 확인할 수 있습니다.
d instanceof Date && isFinite(d)
프레임 간 문제를 피하기 위해 instanceof
검사를 다음으로 바꿀 수 있습니다.
Object.prototype.toString.call(d) === '[object Date]'
Borgar의 대답 에서와 같이 getTime()
대한 호출 isNaN()
및 isFinite()
둘 다 암시적으로 숫자로 변환되므로 불필요합니다.
Christoph내 솔루션은 유효한 날짜 개체를 얻었는지 여부를 간단히 확인하는 것입니다.
구현
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
Ash Clarke유효한 날짜를 확인하는 가장 짧은 대답
if(!isNaN(date.getTime()))
abhirathore2006 다음은 예입니다.
var m = moment('2015-11-32', 'YYYY-MM-DD'); m.isValid(); // false
문서의 유효성 검사 섹션 은 매우 명확합니다.
또한 다음 구문 분석 플래그로 인해 날짜가 유효하지 않습니다.
-
overflow
: 13월, 32일(또는 윤년이 아닌 경우 2월 29일), 367일 등과 같은 날짜 필드의 오버플로. overflow에는 유효하지 않은 인덱스가 포함됩니다. #invalidAt와 일치하는 단위(아래 참조); -1은 오버플로가 없음을 의미합니다. -
invalidMonth
: moment('Marbruary', 'MMMM');와 같은 잘못된 월 이름입니다. 잘못된 월 문자열 자체를 포함하거나 그렇지 않으면 null을 포함합니다. -
empty
: moment('this is nonsense');와 같이 구문 분석할 수 있는 항목이 포함되지 않은 입력 문자열입니다. 부울. - 등.
출처: http://momentjs.com/docs/
Yves M.jQuery UI DatePicker 위젯에는 형식과 유효성(예: 2013년 1월 33일 날짜가 허용되지 않음)을 확인하는 매우 우수한 날짜 유효성 검사기 유틸리티 메서드가 있습니다.
페이지에서 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 객체가 됩니다. 그렇지 않으면 정의되지 않습니다.
Matt Campbell나는 이 작은 조각에 정말 가까운 몇 가지 답변을 보았습니다.
자바스크립트 방식:
function isValidDate(dateObject){ return new Date(dateObject).toString() !== 'Invalid Date'; } console.log(isValidDate('WTH')); // -> false console.log(isValidDate(new Date('WTH'))); // -> false console.log(isValidDate(new Date())); // -> true
ES2015 방법:
const isValidDate = dateObject => new Date(dateObject ) .toString() !== 'Invalid Date'; console.log(isValidDate('WTH')); // -> false console.log(isValidDate(new Date('WTH'))); // -> false console.log(isValidDate(new Date())); // -> true
Jason Foglia// check whether date is valid var t = new Date('2011-07-07T11:20:00.000+00:00x'); valid = !isNaN(t.valueOf());
faridz나는 Christoph의 접근 방식이 정말 마음에 들었습니다(그러나 그것에 대해 투표할 평판이 충분하지 않았습니다). 내 사용을 위해 항상 Date 객체가 있다는 것을 알고 있으므로 valid() 메서드로 날짜를 확장했습니다.
Date.prototype.valid = function() { return isFinite(this); }
이제 이것을 작성할 수 있으며 코드에서 isFinite를 확인하는 것보다 훨씬 더 설명적입니다...
d = new Date(userDate); if (d.valid()) { /* do stuff */ }
broox다음 코드를 사용하여 연도, 월 및 날짜 값의 유효성을 검사합니다.
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; }
자세한 내용은 자바스크립트에서 날짜 확인 하기를 참조하세요.
Jingguo Yao이 스크립트로 txDate.value의 유효한 형식을 확인할 수 있습니다. 잘못된 형식인 경우 Date 객체가 인스턴스화되지 않고 dt에 null을 반환합니다.
var dt = new Date(txtDate.value) if (isNaN(dt))
그리고 @MiF가 짧은 방법으로 제안한 것처럼
if(isNaN(new Date(...)))
Yuseferi여기에 이미 복잡한 답변이 너무 많지만 간단한 한 줄이면 충분합니다(ES5).
Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;
또는 ES6에서도 :
Date.prototype.isValid = d => !isNaN(Date.parse(d));
Sebastien H.이것은 나를 위해 일했습니다.
new Date('foo') == 'Invalid Date'; //is true
그러나 이것은 작동하지 않았습니다.
new Date('foo') === 'Invalid Date'; //is false
user1296274Angular.js 프로젝트의 경우 다음을 사용할 수 있습니다.
angular.isDate(myDate);
Nick TarasBorgar의 솔루션을 기반으로 다음 솔루션을 작성했습니다. 내 보조 기능 라이브러리에 포함되어 이제 다음과 같이 보입니다.
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()); }
Dmytro Shevchenko2012년 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
DexIsValidDate: 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; }
Michael Goldshmidt이 기능을 작성했습니다. 문자열 매개변수를 전달하면 "dd/MM/yyyy" 형식을 기반으로 유효한 날짜인지 여부를 판별합니다.
여기 테스트가 있습니다
입력: "하하하", 출력: 거짓.
입력: "2000/2/29", 출력: true.
입력: "2001년 2월 29일", 출력: 거짓.
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; } }
YaseenDate.prototype.toISOString
RangeError
(적어도 Chromium 및 Firefox에서)를 발생시킵니다. 유효성 검사 수단으로 사용할 수 있으며 isValidDate
그 자체(EAFP)가 필요하지 않을 수 있습니다. 그렇지 않으면 다음과 같습니다.
function isValidDate(d) { try { d.toISOString(); return true; } catch(ex) { return false; } }
saaj위의 솔루션 중 어느 것도 효과가 없었지만 효과가 있었던 것은
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일로 만들 때 유효하지 않음을 확인합니다.
JohnBorgar의 접근 방식에서 영감을 받아 코드가 날짜의 유효성을 검사할 뿐만 아니라 실제로 날짜가 실제 날짜인지 확인했습니다. 즉, 2011년 9월 31일 및 2011년 2월 29일과 같은 날짜는 허용되지 않습니다.
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!"; }
Raz도서관 없이 할 수 있는 경우에는 도서관을 거의 추천하지 않습니다. 그러나 지금까지 수많은 답변을 고려할 때 인기 있는 "date-fns" 라이브러리에 isValid
기능이 있다는 점을 지적할 가치가 있는 것 같습니다. 다음 문서는 웹 사이트에서 가져옵니다.
isValid 인수 | v2.0.0 이전 | v2.0.0 이상 |
---|
새로운 날짜() | 진실 | 진실 |
새로운 날짜('2016-01-01') | 진실 | 진실 |
새로운 날짜('') | 거짓 | 거짓 |
새로운 날짜(1488370835081) | 진실 | 진실 |
새로운 날짜(NaN) | 거짓 | 거짓 |
'2016-01-01' | 유형 오류 | 거짓 |
'' | 유형 오류 | 거짓 |
1488370835081 | 유형 오류 | 진실 |
난 | 유형 오류 | 거짓 |
Carsten Führmann주어진 객체가 다음과 같은 경우 해당 검사에서 찾은 최고의 성능 결과를 결합했습니다.
결과는 다음과 같습니다.
function isValidDate(input) { if(!(input && input.getTimezoneOffset && input.setUTCFullYear)) return false; var time = input.getTime(); return time === time; };
zVictor아직 아무도 언급하지 않았으므로 Symbols도 갈 길입니다.
Symbol.for(new Date("Peter")) === Symbol.for("Invalid Date") // true Symbol.for(new Date()) === Symbol.for("Invalid Date") // false
console.log('Symbol.for(new Date("Peter")) === Symbol.for("Invalid Date")', Symbol.for(new Date("Peter")) === Symbol.for("Invalid Date")) // true console.log('Symbol.for(new Date()) === Symbol.for("Invalid Date")', Symbol.for(new Date()) === Symbol.for("Invalid Date")) // false
주의: https://caniuse.com/#search=Symbol
Stefan Rein지금까지 모든 답변을 읽은 후 가장 간단한 답변을 자주 하겠습니다.
여기의 모든 솔루션은 date.getTime()
호출을 언급합니다. 그러나 날짜에서 숫자로의 기본 변환은 getTime() 값을 사용하는 것이기 때문에 이것은 필요하지 않습니다. 예, 유형 검사가 불평할 것입니다. Date
객체가 있다는 것을 분명히 알고 있으므로 테스트할 필요도 없습니다.
유효하지 않은 날짜를 테스트하려면:
isNaN(date)
유효한 날짜를 테스트하려면:
!isNaN(date)
Steven Spungin문자열에 대한 날짜 개체는 두 필드가 모두 유효한 날짜인지 감지하는 더 간단하고 안정적인 방법입니다. 예를 들어 날짜 입력 필드에 이 "-------"를 입력하는 경우. 위의 답변 중 일부는 작동하지 않습니다.
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}.');
kam날짜의 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)
Denis Ryzhkov날짜와 시간을 밀리초로 변환할 수 있습니다. getTime()
이 getTime()
메서드는 유효하지 않은 경우 NaN
if(!isNaN(new Date("2012/25/255").getTime())) return 'valid date time'; return 'Not a valid date time';
Mina Gabriel선택한 답변이 훌륭해서 저도 잘 사용하고 있습니다. 그러나 사용자 날짜 입력의 유효성을 검사하는 방법을 찾고 있다면 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()); });
dolphus333출처 : http:www.stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript