[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와 달리 모든 객체를 변경할 수 없으므로 암시적인 날짜 변이와 관련된 놀라운 놀라움이 없습니다.

더 많은 정보

또한보십시오:

JavaScript 날짜 구문 분석 라이브러리에 대한 Rob Gravelle의 기사 시리즈 :

결론

물론 사람이 정규 표현식을 쓰기 바퀴를 재발견하려고 (수 있지만 하시기 바랍니다 당신이 그것을하기 전에 실제로 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);
    }