[javascript] 문자열이 날짜 값인지 확인
값이 유효한 날짜인지, 알려진 날짜 형식인지 확인하는 쉬운 방법은 무엇입니까?
나는 값이 예를 들어 10-11-2009
, 10/11/2009
, 2009-11-10T07:00:00+0000
모든 날짜 값으로 인식되어야하고, 값은 200
, 10
, 350
, 날짜 값으로 인식되지 않아야한다. 이것이 가능하다면 이것을 확인하는 가장 간단한 방법은 무엇입니까? 타임 스탬프도 허용되기 때문입니다.
답변
겠습니까 Date.parse()
충분?
관련 MDN 설명서 페이지를 참조하십시오 .
답변
2015 년 업데이트
오래된 질문이지만 다른 새로운 질문은 다음과 같습니다.
이것과 중복되어 닫히므로 여기에 새로운 정보를 추가하는 것이 중요하다고 생각합니다. 사람들이 실제로 여기에 게시 된 코드 중 일부를 복사하여 붙여 넣고 프로덕션 환경에서 사용한다고 무서워하기 때문에 그것을 쓰고 있습니다.
답변의 대부분은 여기에 중 일부 매우 특정한 형식에 맞게 일부 복잡한 정규 표현식을 사용하고 (광고로 실제 ISO 날짜와 일치하지 않는 동안 월 32 일치처럼 – 볼 실제로 잘못을 데모를 ) 또는 그들이 아무것도를 전달하려고 Date
생성자 최고를 기원합니다.
순간 사용
이 답변 에서 설명했듯이 현재 사용할 수있는 라이브러리가 있습니다 :
Moment.js
표준 JavaScript 날짜 처리 기능보다 훨씬 풍부한 API를 가진 JavaScript로 날짜를 구문 분석, 유효성 검증, 조작 및 표시하는 라이브러리입니다.
12kB 축소 / gzip으로 Node.js 및 기타 장소에서 작동합니다.
bower install moment --save # bower
npm install moment --save # npm
Install-Package Moment.js # NuGet
spm install moment --save # spm
meteor add momentjs:moment # meteor
Moment를 사용하면 유효한 날짜 확인에 대해 매우 구체적으로 지정할 수 있습니다. 때로는 원하는 형식에 대한 단서를 추가하는 것이 매우 중요합니다. 예를 들어, DD / MM / YYYY 형식을 사용하지 않으면이 날짜를 유효하지 않은 것으로 거부하지 않으면 06/22/2015와 같은 날짜는 유효한 날짜처럼 보입니다. 예를 들어 Moment에 어떤 형식을 예상 할 수 있는지 몇 가지 방법이 있습니다.
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
true
인수는 순간 그것을하지 않는 경우 입력을 구문 분석을 시도하지 않도록이 정확하게 제공하는 형식 중 하나에 적합 (내 의견의 기본 동작해야한다).
내부적으로 제공되는 형식을 사용할 수 있습니다.
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
그리고 여러 형식을 배열로 사용할 수 있습니다.
var formats = [
moment.ISO_8601,
"MM/DD/YYYY :) HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015 :) 13*17*21", formats, true).isValid(); // true
moment("06/22/2015 :( 13*17*21", formats, true).isValid(); // false
DEMO 참조하십시오 .
다른 도서관
Moment.js를 사용하지 않으려면 다른 라이브러리도 있습니다.
2016 년 업데이트
나는 Moment의 하위 집합과 같은 immoment 모듈을 만들었지 만 기존 객체의 돌연변이로 인한 놀라움은 없습니다 (자세한 내용 은 문서 를 참조하십시오).
2018 업데이트
오늘 은 Moment와 달리 날짜 / 시간 조작에 Luxon 을 사용하는 것이 좋습니다. Moment와 달리 모든 객체를 변경할 수 없으므로 암시적인 날짜 변이와 관련된 놀라운 놀라움이 없습니다.
더 많은 정보
또한보십시오:
- Jay Raj의 Moment.js 를 사용하여 날짜 및 시간 관리
- Bradley Holbrook의 Moment.js 를 사용하여 JavaScript 날짜 작업
JavaScript 날짜 구문 분석 라이브러리에 대한 Rob Gravelle의 기사 시리즈 :
- 인기있는 JavaScript 날짜 구문 분석 라이브러리 정리 : Moment.js
- 인기있는 JavaScript 날짜 구문 분석 라이브러리 정리 : Datejs
- 인기있는 JavaScript 날짜 구문 분석 라이브러리의 정리 : XDate
결론
물론 사람이 정규 표현식을 쓰기 바퀴를 재발견하려고 (수 있지만 하시기 바랍니다 당신이 그것을하기 전에 실제로 ISO 8601 및 RFC 3339을 읽기)처럼 또는 호출 구문 분석 오류 메시지에 임의의 데이터와 생성자 BUIT-에서 'Invalid Date'
(확인이 메시지는 당신이 있습니까 정확히 같은 모든 플랫폼에서? 모든 로케일에서? 앞으로?) 또는 당신이 테스트 솔루션을 사용하고 그것을 개선하기 위해 시간을 사용할 수 있습니다, 그것을 재발견 없습니다. 여기에 나열된 모든 라이브러리는 공개 소스, 무료 소프트웨어입니다.
답변
이것이 내가 현재 작업중 인 앱 에서이 문제를 해결하는 방법입니다.
krillgar의 피드백을 기반으로 업데이트되었습니다.
var isDate = function(date) {
return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}
답변
new Date(date) === 'Invalid Date'
Firefox 및 Chrome에서만 작동합니다. IE8 (테스트 목적으로 내 컴퓨터에있는 것)은 NaN을 제공합니다.
허용 된 답변에 명시된 바와 같이 Date.parse(date)
숫자에도 적용됩니다. 따라서 그 문제를 해결하기 위해 숫자가 아닌지 확인할 수도 있습니다 (확인하려는 경우).
var parsedDate = Date.parse(date);
// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
/* do your work */
}
답변
이런 건 어때? Date 객체 또는 날짜 문자열인지 테스트합니다.
function isDate(value) {
var dateFormat;
if (toString.call(value) === '[object Date]') {
return true;
}
if (typeof value.replace === 'function') {
value.replace(/^\s+|\s+$/gm, '');
}
dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
return dateFormat.test(value);
}
나는 이것이 ISO 형식의 문자열을 테스트하지는 않지만 RegExp에 약간의 노력을 기울이면 좋을 것입니다.
답변
여기에 2 월 31 일과 같이 날짜가 유효하지 않은지 여부를 확인하는 답변은 없습니다.이 함수는 반환 된 월이 원래 월과 같은지 확인하고 유효한 연도가 표시되었는지 확인하여 해결합니다.
//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy
function isValidDate(s) {
var separators = ['\\.', '\\-', '\\/'];
var bits = s.split(new RegExp(separators.join('|'), 'g'));
var d = new Date(bits[2], bits[1] - 1, bits[0]);
return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1];
}
답변
정규식을 사용하여 유효성을 검사하십시오.
isDate('2018-08-01T18:30:00.000Z');
isDate(_date){
const _regExp = new RegExp('^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$');
return _regExp.test(_date);
}