날짜가 유효한지 확인


124

다음은 시나리오입니다.

나는이 String날짜와 다른 날짜 형식을. 예 :
날짜 : 2016-10-19
dateFormat : "DD-MM-YYYY".

이 날짜가 유효한 날짜인지 확인해야합니다.

나는 다음 일을 시도했다

var d = moment("2016-10-19",dateFormat);

d.isValid()false매번 돌아오고 있습니다. Moment.js는 주어진 형식으로 날짜를 구문 분석하지 않습니까?

그런 다음 DD-MM-YYYY먼저 날짜 형식을 지정하고 Moment.js에 전달하려고했습니다.

var d = moment("2016-10-19").format(dateFormat);
var date = moment(d, dateFormat);

이제 date.isValid()원하는 결과를 얻었지만 여기에서는 Moment.js 날짜 개체가 두 번 생성됩니다. 이것을 어떻게 피할 수 있습니까? 더 나은 해결책이 있습니까?

참고로 dateFormat.


dateFormat의 값을 변경할 수 없습니까? 이 경우 입력 형식을 변경해야합니다. 2016-10-19는 DD-MM-YYYY가 아니라 YYYY-MM-DD이기 때문입니다. 무엇을 변경할 수 있습니까?
Pochen

입력은 날짜 선택기에서 나옵니다. 너무 변경할 수 없습니다 :(
Ganesh

1
dateFormat 변수를 변경할 수없는 이유를 물어봐도 될까요? var d = moment ( "19-10-2016", "DD-MM-YYYY"); 지금까지 내가 걱정으로 문제를 해결할 것
Pochen

정말 말할 수 없습니다. 하지만 그 가치를 바꾸는 것은 제가 할 수있는 일이 아닙니다.
Ganesh

답변:


185

해결책을 찾을 수있었습니다. 내가 얻는 날짜가 ISO 형식이므로 날짜를 순간적으로 제공하는 것만으로 유효성을 검사하고 dateFormat을 전달할 필요가 없습니다.

var date = moment("2016-10-19");

그런 다음 date.isValid()원하는 결과 를 제공합니다.


15
현재 선호하는 방법이 무엇인지 아는 사람이 있습니까? 이 메서드는 이제 다음 "Deprecation Warning"을 발생시킵니다. 순간 생성이 js Date로 돌아갑니다. 이는 권장되지 않으며 향후 주요 릴리스에서 제거 될 예정입니다. 자세한 내용은 github.com/moment/moment/issues/1407 을 참조하세요 .
Andrew


4
이것이 항상 작동하는 것은 아닙니다 var a = moment('12345'); a.isValid() // is true. 날짜를 구문 분석 할 수없는 경우 moment가 기본 날짜 개체로 돌아 가기 때문에 실패합니다. 그리고 기본 날짜 개체는 항상 날짜를 반환합니다 (당신이 원하는 그냥 하나를.)
Mauvis Ledford

1
필요가 그것을 추가하는 moment('02').isValid() === true당신이 조심해야 할 수 있습니다, 그래서
브루노 손가락

3
또한moment('abcde 1').isValid() === true
Amiram Korach

119

var date = moment('2016-10-19', 'DD-MM-YYYY', true);

moment엄격한 구문 분석을 적용 하는 호출시 세 번째 인수를 추가해야합니다 . 다음은 순간 문서의 관련 부분입니다. http://momentjs.com/docs/#/parsing/string-format/ 섹션 끝 부분에 있습니다.


이것은 효과가 없습니다.
Billal Begueradj

이 대답은 정답이어야합니다 ........ @ Begueradj 이것은 효과가 있습니다. 다른 값을 사용해보십시오. 때로는 정확하고 때로는 틀립니다
Akki

그리고 여기에서
kuhr

이것은 당신이 년으로 0000를 입력하게됩니다
에디

17

여기 있습니다 : Working Fidddle

$(function(){
  var dateFormat = 'DD-MM-YYYY';
  alert(moment(moment("2012-10-19").format(dateFormat),dateFormat,true).isValid());
});

내가 말했듯이 dateFormat은 'DD-MM-YYYY'이며 변경할 수 없습니다.
Ganesh

아, 알겠습니다. 그것을 보자.
gschambial

여기서 날짜 문자열을 변경할 수 2016-10-19있습니까?
gschambial

아니. 그것은 날짜 선택기에서 온 것입니다
Ganesh

1
datepicker에서 가져온 후 입력하기 전에 수정할 수 없습니까 var d = moment("2016-10-19",dateFormat);?
gschambial

14

새로운 Date와 함께 moment를 사용하여 undefined데이터 값의 경우를 처리 합니다.

const date = moment(new Date("2016-10-19"));

때문에: moment(undefined).isValid() == true

더 나은 방법으로 : moment(new Date(undefined)).isValid() == false



8

날짜와 날짜 형식이 다른 경우 Moment를 사용하여 문자열이 유효한 날짜인지 확인하는 방법

죄송합니다.이 스레드의 주어진 솔루션이 실제로 질문에 답한 것이 있습니까?

문자열 날짜와 다른 날짜 형식이 있습니다. 예 : 날짜 : 2016-10-19 dateFormat : "DD-MM-YYYY". 이 날짜가 유효한 날짜인지 확인해야합니다.

다음은 나를 위해 작동합니다 ...

const date = '2016-10-19';
const dateFormat = 'DD-MM-YYYY';
const toDateFormat = moment(new Date(date)).format(dateFormat);
moment(toDateFormat, dateFormat, true).isValid();

// Note: `new Date()` circumvents the warning that
// Moment throws (https://momentjs.com/guides/#/warnings/js-date/),
// but may not be optimal.

그러나 솔직히 moment.isDate()( 문서화 된대로 ) 왜 객체를 받아들이 는지 이해하지 마십시오 . 내 의견으로는 문자열을 지원해야합니다.


1
세 번째 인수로 참을 전달하면 정확한 날짜 형식을 확인합니다.
Raj Kumar N

2
console.log(` moment('2019-09-01', 'YYYY-MM-DD').isValid()?  ` +moment('2019-09-01', 'YYYY-MM-DD').isValid())
console.log(` moment('2019-22-01', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-01', 'YYYY-DD-MM').isValid())
console.log(` moment('2019-22-22', 'YYYY-DD-MM').isValid()?  ` +moment('2019-22-22', 'YYYY-DD-MM').isValid())
console.log(` moment('undefined', 'YYYY-DD-MM').isValid()?  ` +moment('undefined', 'YYYY-DD-MM').isValid())

 moment('2019-09-01', 'YYYY-MM-DD').isValid()?  true
 moment('2019-22-01', 'YYYY-DD-MM').isValid()?  true
 moment('2019-22-22', 'YYYY-DD-MM').isValid()?  false
 moment('undefined', 'YYYY-DD-MM').isValid()?  false

답변에 대한 설명을 추가해 주시겠습니까? 이것은 이미 존재하고 수용된 답변에 어떤 추가 가치를 더합니까?
slfan

0

날짜가 유효하면는 getTime()항상 자신과 같습니다.

var date = new Date('2019-12-12');
if(date.getTime() - date.getTime() === 0) {
    console.log('Date is valid');
} else {
    console.log('Date is invalid');
}

-2

이거 한번 해봐. 좋지는 않지만 입력이 날짜 선택기의 일정한 형식이면 작동합니다.

이 예에서는 선택기에서 오는 badDate입니다.

https://jsfiddle.net/xs8tvox9/

var dateFormat = 'DD-MM-YYYY'
var badDate = "2016-10-19";

var splittedDate = badDate.split('-');

if (splittedDate.length == 3) {
  var d = moment(splittedDate[2]+"-"+splittedDate[1]+"-"+splittedDate[0], dateFormat);
  alert(d.isValid())
} else {
  //incorrectFormat
}

1
제발 이러지마
tdelam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.