답변:
겠습니까 Date.parse()
충분?
관련 MDN 설명서 페이지를 참조하십시오 .
Date.parse("4.3")
입니다 986270400000
.
오래된 질문이지만 다른 새로운 질문은 다음과 같습니다.
이것과 중복되어 닫히므로 여기에 새로운 정보를 추가하는 것이 중요하다고 생각합니다. 사람들이 실제로 여기에 게시 된 코드 중 일부를 복사하여 붙여 넣고 프로덕션 환경에서 사용한다고 무서워하기 때문에 그것을 쓰고 있습니다.
답변의 대부분은 여기에 중 일부 매우 특정한 형식에 맞게 일부 복잡한 정규 표현식을 사용하고 (광고로 실제 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를 사용하지 않으려면 다른 라이브러리도 있습니다.
나는 Moment의 하위 집합과 같은 immoment 모듈을 만들었지 만 기존 객체의 돌연변이로 인한 놀라움은 없습니다 (자세한 내용 은 문서 를 참조하십시오).
오늘 은 Moment와 달리 날짜 / 시간 조작에 Luxon 을 사용하는 것이 좋습니다. Moment와 달리 모든 객체를 변경할 수 없으므로 암시적인 날짜 변이와 관련된 놀라운 놀라움이 없습니다.
또한보십시오:
JavaScript 날짜 구문 분석 라이브러리에 대한 Rob Gravelle의 기사 시리즈 :
물론 사람이 정규 표현식을 쓰기 바퀴를 재발견하려고 (수 있지만 하시기 바랍니다 당신이 그것을하기 전에 실제로 ISO 8601 및 RFC 3339을 읽기)처럼 또는 호출 구문 분석 오류 메시지에 임의의 데이터와 생성자 BUIT-에서 'Invalid Date'
(확인이 메시지는 당신이 있습니까 정확히 같은 모든 플랫폼에서? 모든 로케일에서? 앞으로?) 또는 당신이 테스트 솔루션을 사용하고 그것을 개선하기 위해 시간을 사용할 수 있습니다, 그것을 재발견 없습니다. 여기에 나열된 모든 라이브러리는 공개 소스, 무료 소프트웨어입니다.
moment("whatever 123").isValid()
을 반환합니다 true
.
moment("06/22/2015", "DD/MM/YYYY", true).isValid();
과 같이 사용하는 것이 가장 좋습니다 . 예상 날짜 형식이 명시 적으로 제공되고 true
엄격한 검사를 의미 하는 인수가 있습니다. 더 많은 정보와 더 나은 예제로 답변을 업데이트했습니다.
이것이 내가 현재 작업중 인 앱 에서이 문제를 해결하는 방법입니다.
krillgar의 피드백을 기반으로 업데이트되었습니다.
var isDate = function(date) {
return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}
new Date(date)
'잘못된 날짜'를 제공하지 않습니다.
new Date(date) !== "Invalid Date"
의지 항상 반환 사실 왼쪽 식의 TIMEVALUE으로 Date 객체를 반환하기 때문에 NaN이 될 수 없다, ===
문자열. ==
타입 변환으로 인해 "works"를 사용 합니다. 그러나 날짜 문자열을 구문 분석하는 것은 여전히 구현에 의존하기 때문에 심각하게 결함이있는 임의 형식을 구문 분석하는 데 의존합니다.
isDate('Mac OS X 10.14.2')
여기에 true를 반환합니다.
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 */
}
isNan
기능은 아닙니다. 첫 번째 인스턴스의 경우가 잘못되었습니다.
date
입니다 Foostreet 1
, 당신의 상태는 참으로 평가됩니다.
이런 건 어때? 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];
}
위의 모든 의견을 참조하여 해결책을 찾았습니다.
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에.
YYYY-MM-DD
이기 때문에 나에게 가장 효과적이었습니다. 따라서이 T00:00:00.000Z
솔루션을 첨부 하고 사용하여 유효한 문자열을 확인하는 것은 쉽지 않습니다.
다음을 사용하는 개선 된 기능은 다음과 같습니다 Date.parse()
.
function isDate(s) {
if(isNaN(s) && !isNaN(Date.parse(s)))
return true;
else return false;
}
참고 : Date.parse ()는 숫자를 구문 분석합니다. 예를 들어 Date.parse(1)
날짜를 반환합니다. 따라서 여기서는 s
날짜가 아닌 숫자 인지 확인 합니다.
다음은 미니멀리스트 버전입니다.
var isDate = function (date) {
return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}
isDate(" 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;
}
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
나는 그것이 오래된 질문이라는 것을 알고 있지만 같은 문제에 직면하여 답이 제대로 작동하지 않는 것을 보았습니다. 특히 원래 질문 인 날짜부터 숫자 (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"));
console.log("hello 1 ", isDate("hello 1 "));
true 반환
이것이 내가 끝내는 방법입니다. 모든 형식을 다루지는 않습니다. 그에 따라 조정해야합니다. 형식을 제어 할 수 있으므로 나에게 효과적입니다.
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;
}
}
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
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");
}
이 시도:
if (var date = new Date(yourDateString)) {
// if you get here then you have a valid date
}