문자열이 날짜 값인지 확인


207

값이 유효한 날짜인지, 알려진 날짜 형식인지 확인하는 쉬운 방법은 무엇입니까?

나는 값이 예를 들어 10-11-2009, 10/11/2009, 2009-11-10T07:00:00+0000모든 날짜 값으로 인식되어야하고, 값은 200, 10, 350, 날짜 값으로 인식되지 않아야한다. 이것이 가능하다면 이것을 확인하는 가장 간단한 방법은 무엇입니까? 타임 스탬프도 허용되기 때문입니다.


답변:


41

겠습니까 Date.parse()충분?

관련 MDN 설명서 페이지를 참조하십시오 .


24
2 월에 유효하지 않은 날짜에 대한 반품이 계속 반환
— 되므로이 점에주의하십시오

58
주의해야 할 또 다른 이유-숫자는 날짜로 구문 분석됩니다. Date.parse("4.3")입니다 986270400000.
— Mogsdad

위의 '주의'사례를 모두 사용하여 바이올린을 시도했습니다. console.log (Date.parse ( "2013-02-31")); console.log (Date.parse ( "4.3")); 그리고 두 경우 모두 (firefox에서) NaN을 반환 했으므로 Date.parse는 괜찮아 보입니다 (어쨌든 구문 분석하기 전에 대시와 올바른 길이를 미리 확인하고 있습니다).
— Cloudranger

55
@Asmor 죄송합니다. 정답이 아닙니다. Date.parse는 숫자로 문자열을 구문 분석합니다.
— jwerre

11
Date.parse ( "My Name 8")가 99662040000으로 올랐습니다. 나는 이것을 사용하고 지금 고통 받고 있습니다.
— Rohith

250

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'(확인이 메시지는 당신이 있습니까 정확히 같은 모든 플랫폼에서? 모든 로케일에서? 앞으로?) 또는 당신이 테스트 솔루션을 사용하고 그것을 개선하기 위해 시간을 사용할 수 있습니다, 그것을 재발견 없습니다. 여기에 나열된 모든 라이브러리는 공개 소스, 무료 소프트웨어입니다.


4
정확히 어떻게 사용해야합니까? moment("whatever 123").isValid()을 반환합니다 true.
— krivar

4
@krivar 다음 moment("06/22/2015", "DD/MM/YYYY", true).isValid();과 같이 사용하는 것이 가장 좋습니다 . 예상 날짜 형식이 명시 적으로 제공되고 true엄격한 검사를 의미 하는 인수가 있습니다. 더 많은 정보와 더 나은 예제로 답변을 업데이트했습니다.
— rsp

2
그래도 사용자 입력을 확인하고 있으며 예상 날짜 형식을 모릅니다.
— Jan Van der Haegen

3
@JanVanderHaegen 3/4/5가 유효한 날짜이고 2015 년 4 월 1 일과 같다고 가정 할 수있는 경우, 지원되는 형식의 명시 적 목록에 해당 형식을 추가하는 것이 좋습니다. 언급 한 3/4/5는 명시적인 형식이 없으면 모호합니다.
— rsp

3
이것은 내가 본 것 중 가장
— 훌륭하고

63

이것이 내가 현재 작업중 인 앱 에서이 문제를 해결하는 방법입니다.

krillgar의 피드백을 기반으로 업데이트되었습니다.

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}

5
노드에 대해 (새 날짜 (날짜)). toString ()! == "잘못된 날짜"를 반환해야했습니다. 또한 참고하십시오. true : false는 중복입니다. 여기서는 단순히 표현식을 반환하는 것으로 충분합니다.
— domenukk

IE8에서는 new Date(date)'잘못된 날짜'를 제공하지 않습니다.
— krillgar

13
이것은 좋은 대답이 아닙니다. new Date(date) !== "Invalid Date"의지 항상 반환 사실 왼쪽 식의 TIMEVALUE으로 Date 객체를 반환하기 때문에 NaN이 될 수 없다, ===문자열. ==타입 변환으로 인해 "works"를 사용 합니다. 그러나 날짜 문자열을 구문 분석하는 것은 여전히 ​​구현에 의존하기 때문에 심각하게 결함이있는 임의 형식을 구문 분석하는 데 의존합니다.
— RobG

4
새로운 날짜 ( "469") 결과 1 Jan 01 469 00:00:00 GMT + 0200 (EET)
— Dan Ochiana

3
이것은 잘못 받아 들여진 정답과 비슷합니다. isDate('Mac OS X 10.14.2')여기에 true를 반환합니다.
— BradStell

24

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

2
몇 년 후인 것이지만 isNan기능은 아닙니다. 첫 번째 인스턴스의 경우가 잘못되었습니다.
— Tim Lewis

작동하지 않습니다. 경우 date입니다 Foostreet 1, 당신의 상태는 참으로 평가됩니다.
— Fabian Picone

9

이런 건 어때? 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에 약간의 노력을 기울이면 좋을 것입니다.


7

여기에 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];
} 

질문이 문자열이 '유효한'날짜인지 확인하는 것이 아니라 문자열을 확인하는 것만으로 날짜 형식을 나타냅니다.
— Thizzer

@Thizzer 좋은 지적. 나는 고치지 않지만 귀하의 질문을 다시 읽으면 10이 유효하지 않아야하지만 타임 스탬프가 허용되어야한다고 말했기 때문에 나는 혼란에 빠졌습니다.
— ykay 말한다 Reinstate Monica

xD는 심지어 날짜 / 타임 스탬프가있는 초기 시절의 질문조차도 알지 못했습니다. 오늘 나중에 질문을 편집하려고합니다.
— Thizzer

왜 1 월에 1 개월이 되었습니까?
— Kapil Raghuwanshi '

당신이 적절한 날짜를 생성하려면 1을 빼고 원래 달에 해당하는지 확인하려면 1을 추가해야하므로 @KapilRaghuwanshi 자바 스크립트 날짜가 제로를 기반으로 한 달 사용
— ykay는 분석 재개 모니카 말한다

5

정규식을 사용하여 유효성을 검사하십시오.

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

4

위의 모든 의견을 참조하여 해결책을 찾았습니다.

Date전달 된 ISO 형식이거나 다른 형식으로 조작 해야하는 경우 작동합니다 .

var isISO = "2018-08-01T18:30:00.000Z";

if (new Date(isISO) !== "Invalid Date" && !isNaN(new Date(isISO))) {
    if(isISO == new Date(isISO).toISOString()) {
        console.log("Valid date");
    } else {
        console.log("Invalid date");
    }
} else {
    console.log("Invalid date");
}

당신은 재생할 수 있습니다 여기 JSFiddle에.


1
이 솔루션은 내 앱에서 지원하는 날짜 문자열이 형식 YYYY-MM-DD이기 때문에 나에게 가장 효과적이었습니다. 따라서이 T00:00:00.000Z솔루션을 첨부 하고 사용하여 유효한 문자열을 확인하는 것은 쉽지 않습니다.
— 가속

자바 스크립트의 경우 작동하지만 typescript에서 사용하는 방법은 무엇입니까?
— Sae

3

다음을 사용하는 개선 된 기능은 다음과 같습니다 Date.parse().

function isDate(s) {
    if(isNaN(s) && !isNaN(Date.parse(s)))
        return true;
    else return false;
}

참고 : Date.parse ()는 숫자를 구문 분석합니다. 예를 들어 Date.parse(1)날짜를 반환합니다. 따라서 여기서는 s날짜가 아닌 숫자 인지 확인 합니다.


1
'테스트 2'를 통과하면 실제 날짜로 통과하므로 작동하지 않습니다. 최신 버전의 크롬에서 테스트
— user1751287

2

나는 이것을 할 것이다

var myDateStr= new Date("2015/5/2");

if( ! isNaN ( myDateStr.getMonth() )) {
    console.log("Valid date");
}
else {
    console.log("Invalid date");
}

여기서 플레이


2
현재 Chrome, 다른 브라우저에서는 작동하지 않습니다. 제공된 문자열을 변경했으며 EXAMPLE STRING 12345"유효한 날짜"를 반환합니다.

1

다음은 미니멀리스트 버전입니다.

var isDate = function (date) {
    return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}

1
여전히 내 예에서는 작동하지 않습니다.isDate("  1")
— Tomas

@Tom 날짜인지 확인하기 전에 값에 공백 문자가 포함되어 있는지 확인해야합니다. 귀하의 문제는 컨트롤러 논리에 의해 처리되어야하는 특별한 경우입니다.
— Mr. Polywhirl

1
문자열 2020 년 1 월 1 일은 공백이 포함 된 유효한 날짜이므로 공백 문자를 확인할 필요가 없습니다. 당신의 방법은 이것을 설명하지 않습니다.
— Kirstin Walsh

1

이 호출 가능 함수는 완벽하게 작동하며 유효한 날짜에 대해 true를 반환합니다. ISO 형식의 날짜 (yyyy-mm-dd 또는 yyyy / mm / dd)를 사용하여 전화해야합니다.

function validateDate(isoDate) {

    if (isNaN(Date.parse(isoDate))) {
        return false;
    } else {
        if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
            return false;
        }
    }
    return true;
}

1
좋지만 질문에 완전히 대답하지는 않습니다. 특히, 주어진 예 중 하나 인 '2009-11-10T07 : 00 : 00 + 0000'에서는 작동하지 않습니다.
— amadan

validateDate ( '2016-12-30T08 : 00 : 00.000Z') // 작동해야한다고 생각하지 마십시오. // false
— Jose Browne

이것이 작동하는지 여부에 관계없이 다음과 같이 단순화 될 수 있습니다.return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
— Michel Jung

1

나는 그것이 오래된 질문이라는 것을 알고 있지만 같은 문제에 직면하여 답이 제대로 작동하지 않는 것을 보았습니다. 특히 원래 질문 인 날짜부터 숫자 (1,200,345 등)를 제거합니다. 여기 내가 생각할 수있는 다소 정통적인 방법이 있으며 효과가있는 것 같습니다. 실패 할 경우 지적하십시오.

if(sDate.toString() == parseInt(sDate).toString()) return false;

이것은 숫자를 제거하는 줄입니다. 따라서 전체 기능은 다음과 같습니다.

function isDate(sDate) {  
  if(sDate.toString() == parseInt(sDate).toString()) return false; 
  var tryDate = new Date(sDate);
  return (tryDate && tryDate.toString() != "NaN" && tryDate != "Invalid Date");  
}

console.log("100", isDate(100));
console.log("234", isDate("234"));
console.log("hello", isDate("hello"));
console.log("25 Feb 2018", isDate("25 Feb 2018"));
console.log("2009-11-10T07:00:00+0000", isDate("2009-11-10T07:00:00+0000"));


1
console.log("hello 1 ", isDate("hello 1 "));true 반환
— John

당신이 맞아요! 해결책이 있습니까? 지금까지 나는 여기에 어떤 대답도 실제로 문제를 적절하게 해결하지 못했다고 생각합니다!
— peekolo

백분율 인 "100 %"는 true를 반환
— toddmo

0

객체가 Date 객체인지 여부를 찾기 위해 Date 관련 기능을 사용할 수 있는지 확인하는 것이 좋습니까?

처럼

var l = new Date();
var isDate = (l.getDate !== undefined) ? true; false;

0

이것이 내가 끝내는 방법입니다. 모든 형식을 다루지는 않습니다. 그에 따라 조정해야합니다. 형식을 제어 할 수 있으므로 나에게 효과적입니다.

function isValidDate(s) {
            var dt = "";
            var bits = [];
            if (s && s.length >= 6) {
                if (s.indexOf("/") > -1) {
                    bits = s.split("/");
                }
                else if (s.indexOf("-") > -1) {
                    bits = s.split("-");
                }
                else if (s.indexOf(".") > -1) {
                    bits = s.split(".");
                }
                try {
                    dt = new Date(bits[2], bits[0] - 1, bits[1]);
                } catch (e) {
                    return false;
                }
                return (dt.getMonth() + 1) === parseInt(bits[0]);
            } else {
                return false;
            }
        }

-1

좋아, 이것은 오래된 질문이지만 해결책을 확인하는 동안 다른 해결책을 찾았습니다. 나를 위해 getTime () 함수가 날짜 객체에 있는지 확인합니다.

const checkDate = new Date(dateString);

if (typeof checkDate.getTime !== 'function') {
  return;
}

-1

document.getElementById('r1').innerHTML = dayjs('sdsdsd').isValid()

document.getElementById('r2').innerHTML = dayjs('2/6/20').isValid()
<script src="https://unpkg.com/dayjs@1.8.21/dayjs.min.js"></script>

<p>'sdsdsd' is a date: <span id="r1"></span></p>
<p>'2/6/20' is a date: <span id="r2"></span></p>

경량 라이브러리는 당신을 위해 준비 : Day.js


1
이것은 기본적으로 StackOverflow에 광고하는 것이므로 그렇게하지 마십시오.
— c4sh

-4
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
sdf.setLenient(false);

기본적으로 이것은 TRUE로 설정되어 있습니다. 따라서 잘못된 형식의 문자열조차도 좋은 값을 반환합니다.

나는 이것을 다음과 같이 사용했다 :

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
formatter.setLenient(false);
String value = "1990/13/23"; 

try {
      Date date = formatter.parse(value);
      System.out.println(date);
    }catch (ParseException e) 
  {
    System.out.println("its bad");
  }

5
... 자바 스크립트?!
— artparks

-5

이 시도:

if (var date = new Date(yourDateString)) {
    // if you get here then you have a valid date       
}

6
이것은 나를 위해 작동하지 않습니다. 먼저 조건의 var가 구문 분석되지 않지만이를 제거하고 다음과 같이 시도하면 다음과 같습니다. if (date = new Date ( "rubbish")) {alert (date); } 날짜가 쓰레기 인 경우에도 Date 함수가 "유효하지 않은 날짜"(Firefox에서)를 반환하므로 조건이 true로 평가되므로 경고가 계속 실행됩니다. 일부 브라우저가 유효하지 않은 날짜에 null을 반환하면 해당 브라우저에서 작동합니다. 여기에 브라우저 불일치가있을 수 있습니다.
— Cloudranger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.