문자열이 날짜 값인지 확인


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.