JavaScript에서 시간을 비교하지 않고 날짜 부분 만 비교
아래 코드에 어떤 문제가 있습니까?
아마도 시간이 아닌 날짜를 비교하는 것이 더 간단 할 것입니다. 이 작업을 수행하는 방법을 모르고 검색했지만 정확한 문제를 찾을 수 없습니다.
BTW, 경고에 두 날짜를 표시하면 정확히 동일하게 표시됩니다.
내 코드 :
window.addEvent('domready', function() {
var now = new Date();
var input = $('datum').getValue();
var dateArray = input.split('/');
var userMonth = parseInt(dateArray[1])-1;
var userDate = new Date();
userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
if (userDate > now)
{
alert(now + '\n' + userDate);
}
});
날짜를 비교하고 시간을 포함하지 않는 더 간단한 방법이 있습니까?
나는 여전히 JavaScript를 배우고 있으며 시간없이 두 날짜를 비교하는 데 도움이되는 유일한 방법 setHours
은 Date 객체 의 메서드 를 사용 하고 시간, 분, 초 및 밀리 초를 0으로 설정하는 것입니다. 그런 다음 두 날짜를 비교하십시오.
예를 들어
date1 = new Date()
date2 = new Date(2011,8,20)
date2
은시, 분, 초 및 밀리 초로 0으로 설정되지만 date1은 date1이 작성된 시간으로 설정됩니다. date1에서 시간, 분, 초 및 밀리 초를 제거하려면 다음을 수행하십시오.
date1.setHours(0,0,0,0)
이제 시간 요소에 대한 걱정없이 두 날짜를 DATES로 비교할 수 있습니다.
타임 존이되기 전에
날짜 객체를 사용하여 날짜를 바로 표현하면 엄청난 정밀도 문제가 발생합니다. 시간과 시간대를 관리하여 시간을 절약해야하며 어느 단계에서나 다시 몰래 들어갈 수 있습니다. 이 질문에 대한 대답은 함정에 빠지게됩니다.
자바 스크립트 날짜에는 시간대 개념 이 없습니다 . 기본적으로 장치의 "로컬"시간대 또는 지정된 경우 UTC 또는 다른 시간대를 사용하여 문자열을주고받는 편리한 (정적) 기능을 갖춘 순간 (에포크 이후의 틱)입니다. 날짜 객체로 just-a-date ™ 를 나타내려면 날짜가 해당 날짜의 시작 부분에 UTC 자정을 나타내기를 원합니다. 이것은 생성의 계절이나 시간대에 관계없이 날짜로 작업 할 수있게하는 일반적이고 필요한 규칙입니다. 따라서 자정 UTC Date 객체를 만들 때와 serialize 할 때 시간대 개념을 관리하려면 매우주의해야합니다.
콘솔의 기본 동작으로 인해 많은 사람들이 혼동됩니다. 콘솔에 날짜를 뿌리면 표시되는 결과에 시간대가 포함됩니다. 이것은 콘솔이 toString()
날짜를 부르고 toString()
현지 에서 설명하기 때문 입니다. 기본 날짜 에는 시간대가 없습니다 ! (시간이 표준 시간대 오프셋과 일치하는 한 자정 UTC 날짜 개체가 있습니다)
역 직렬화 (또는 자정 UTC Date 객체 생성)
대부분의 경우, 날짜는 사용자의 시간대를 반영하기를 원할 것입니다. 오늘이 생일이라면 클릭하십시오 . NZ와 미국 사용자는 동시에 클릭하여 다른 날짜를 얻습니다. 이 경우, 이렇게하십시오 ...
// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));
때로는 국제 비교가 지역 정확도보다 우월합니다. 이 경우, 이렇게하십시오 ...
// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));
날짜를 역 직렬화
유선 날짜는 종종 YYYY-MM-DD 형식입니다. 역 직렬화하려면 다음을 수행하십시오.
var midnightUTCDate = new Date( dateString + 'T00:00:00Z');
직렬화
시간대를 만들 때주의를 기울인 후에는 문자열 표현으로 다시 변환 할 때 시간대를 유지해야합니다. 안전하게 사용할 수 있습니다 ...
toISOString()
getUTCxxx()
getTime() //returns a number with no time or timezone.
.toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.
그리고 다른 모든 것을 특히 피하십시오.
getYear()
,getMonth()
,getDate()
질문에 대답하기 위해 7 년이 늦었습니다
<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
var now = new Date();
var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
if(userEntered.getTime() < today.getTime())
alert("date is past");
else if(userEntered.getTime() == today.getTime())
alert("date is today");
else
alert("date is future");
}
</script>
이건 어때?
Date.prototype.withoutTime = function () {
var d = new Date(this);
d.setHours(0, 0, 0, 0);
return d;
}
변수 값에 영향을 미치지 않고 다음과 같이 날짜의 날짜 부분을 비교할 수 있습니다.
var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true
Moment.js 사용
타사 라이브러리를 포함시킬 수있는 옵션이 있다면 Moment.js를 살펴볼 가치가 있습니다. 이 작업을하게 Date
하고 DateTime
훨씬, 훨씬 쉽다.
예를 들어, 하나의 날짜가 다른 날짜 뒤에 오지만 시간을 제외하면 다음과 같이 할 수 있습니다.
var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00
// Comparison including time.
moment(date2).isAfter(date1); // => true
// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false
당신이에 전달하는 두 번째 매개 변수는 isAfter
비교를 할 수있는 정밀하고도 될 수 있습니다 year
, month
, week
, day
, hour
, minute
또는 second
.
아래와 같이 .toDateString을 사용하여 간단히 비교하십시오.
new Date().toDateString();
이렇게하면 다음과 같이 시간이나 시간대가 아닌 날짜 부분 만 반환됩니다.
"2017 년 2 월 3 일 금요일"
따라서 두 날짜 모두 시간 형식없이이 형식으로 비교할 수 있습니다.
이것은 좀 더 깔끔한 버전 일 수 있습니다. 또한 parseInt를 사용할 때는 항상 기수를 사용해야합니다.
window.addEvent('domready', function() {
// Create a Date object set to midnight on today's date
var today = new Date((new Date()).setHours(0, 0, 0, 0)),
input = $('datum').getValue(),
dateArray = input.split('/'),
// Always specify a radix with parseInt(), setting the radix to 10 ensures that
// the number is interpreted as a decimal. It is particularly important with
// dates, if the user had entered '09' for the month and you don't use a
// radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
userMonth = parseInt(dateArray[1], 10) - 1,
// Create a Date object set to midnight on the day the user specified
userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);
// Convert date objects to milliseconds and compare
if(userDate.getTime() > today.getTime())
{
alert(today+'\n'+userDate);
}
});
기수에 대한 자세한 내용은 MDC 구문 분석 페이지를 확인하십시오.
JSLint 는 누락 된 기수와 같은 것들을 포착하고 모호하고 디버깅하기 어려운 오류를 잡을 수있는 훌륭한 도구입니다. 더 나은 코딩 표준을 사용하여 향후 두통을 피할 수 있습니다. 코드를 작성하는 모든 JavaScript 프로젝트에서 사용합니다.
date.js의 라이브러리는 이러한 것들에 대한 편리합니다. 모든 JS 날짜 관련 스크립 핑을 훨씬 쉽게 만듭니다.
이것이 내가하는 방법입니다.
var myDate = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today = new Date().setHours(0,0,0,0);
if(today>myDate){
jAlert('Please Enter a date in the future','Date Start Error', function(){
$('input[name=frequency_start]').focus().select();
});
}
여기에 비슷한 접근 방식이 보이지 않고 h / m / s / ms를 0으로 설정하는 것을 좋아하지 않습니다. date
개체 가 변경된 현지 시간대로 정확하게 전환하는 데 문제가 발생할 수 있으므로 (그렇다고 가정합니다) 몇 분 전에 작성된 lil 함수를 여기에 소개하십시오.
+
: 사용하기 쉽고 기본 비교 작업을 수행합니다 (일, 월 및 연도를 시간없이 비교)
-
. 이것은 "즉시 사용"사고와 완전히 반대되는 것 같습니다.
function datecompare(date1, sign, date2) {
var day1 = date1.getDate();
var mon1 = date1.getMonth();
var year1 = date1.getFullYear();
var day2 = date2.getDate();
var mon2 = date2.getMonth();
var year2 = date2.getFullYear();
if (sign === '===') {
if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
else return false;
}
else if (sign === '>') {
if (year1 > year2) return true;
else if (year1 === year2 && mon1 > mon2) return true;
else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
else return false;
}
}
용법:
datecompare(date1, '===', date2)
동등 검사,
datecompare(date1, '>', date2)
큰 검사,
!datecompare(date1, '>', date2)
적은 검사 또는 동일 검사
또한, 분명히, 당신은 전환 할 수 있습니다 date1
및 date2
장소에서 다른 간단한 비교를 달성하기 위해.
게시 된 후이 질문을 상당히 동시에 읽은 후에는 적어도 내 요구에 매우 만족스럽지 않은 다른 솔루션을 게시하기로 결정했습니다.
나는 이와 같은 것을 사용했다 :
var currentDate= new Date().setHours(0,0,0,0);
var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);
그런 식으로 날짜를 나중에 처리하기 위해 원하는 형식으로 사용할 수있었습니다. 그러나 이것은 내 필요에만 해당되었지만 어쨌든 게시하기로 결정했습니다. 아마도 누군가를 도울 것입니다.
날짜를 비교하는 효율적이고 올바른 방법은 다음과 같습니다.
Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);
시간 부분을 무시하고 다른 시간대에서 작동하며 동등성을 비교할 수도 ==
있습니다. 86400000은 하루의 밀리 초 수입니다 ( = 24*60*60*1000
).
등식 연산자 ==
는 두 개의 Date 객체를 비교하고 두 날짜를 비교하지 않기 때문에 등식 테스트가 작동 할 것으로 예상 할 때 실패하므로 Date 객체를 비교하는 데 절대 사용 해서는 안됩니다 .
> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300
> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300
> date1 == date2;
outputs: false
> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true
참고 : 시간 부분이 0으로 설정된 Date 객체를 비교하는 경우 사용할 수는 date1.getTime() == date2.getTime()
있지만 최적화 할 가치는 거의 없습니다. 당신이 사용할 수있는 <
, >
, <=
, 또는 >=
이러한 연산자를 먼저 호출하여 Date 객체로 변환하기 때문에 날짜를 비교하는 객체를 직접 때 .valueOf()
운전자가 비교를 수행하기 전에.
시간 구성 요소가없는 날짜 만 진정으로 비교하는 경우 잘못된 느낌이 들지만 작동하고 모든 Date()
시간과 시간대 두통을 피하는 다른 솔루션은 문자열 비교를 사용하여 ISO 문자열 날짜를 직접 비교하는 것입니다.
> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true
다음을 사용하여 현재 날짜 (UTC 날짜, 필요하지 않은 사용자의 현지 날짜)를 얻을 수 있습니다.
> new Date().toISOString().split("T")[0]
"2019-04-22"
그것을 선호하는 나의 주장은 프로그래머의 단순성입니다. 아마도 속도를 희생하면서 날짜 시간과 오프셋을 올바르게 처리하려고 시도하는 것보다 이것을 버릴 가능성이 훨씬 적습니다 (성능을 비교하지 않았습니다)
userDate
으로 4 자리 연도로 구성해야합니다 setFullYear(10, ...) !== setFullYear(2010, ...)
.
총 ms로 산술을 사용할 수 있습니다.
var date = new Date(date1);
date.setHours(0, 0, 0, 0);
var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;
원래 날짜를 업데이트하지 않고 문자열 분할 및 비교보다 성능이 빠르기 때문에 이것을 좋아합니다.
이 도움을 바랍니다!
나는이 질문에 이미 답변되어 있으며 이것이 최선의 방법은 아니지만 내 시나리오에서 완벽하게 작동하므로 나 같은 사람에게 도움이 될 것이라고 생각했습니다.
당신이있는 경우 date string
로
String dateString="2018-01-01T18:19:12.543";
JS의 다른 Date 객체와 날짜 부분을 비교하려고합니다.
var anotherDate=new Date(); //some date
그런 다음에이 를 사용하여 객체convert
string
Date
new Date("2018-01-01T18:19:12.543");
그리고 여기 속임수가 있습니다 :-
var valueDate =new Date(new Date(dateString).toDateString());
return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result
내가 사용한 toDateString()
의 Date object
날짜 문자열 만 반환 JS,의.
참고 : .valueOf()
날짜를 비교하는 동안 함수 를 사용하는 것을 잊지 마십시오 .
자세한 정보 .valeOf()
는 여기 참조
행복한 코딩.
도움이 될 것입니다. 나는 이것을 이렇게 얻었습니다.
var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())
와 비교하면 setHours()
해결책이 될 것입니다. 견본:
var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
console.log(true)
}else{
console.log(false)
}
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
console.log('False');
}else{
console.log('True');
}
날짜 형식 이 다른 경우 moment.js 라이브러리를 사용 하여 날짜 형식을 변환 한 다음 위의 코드를 사용하여 두 날짜를 비교하십시오
예 :
날짜가 "DD / MM / YYYY"이고 날짜를 "MM / DD / YYYY"로 변환하려면 아래 코드 예를 참조하십시오.
var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);
이 JS는 설정된 날짜 이후 내용이 변경 되지만 w3schools는 동일합니다.
date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing
date1.setHours(0,0,0,0)
var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->
두 날짜 모두에 toDateString ()을 사용하십시오. toDateString은 시간을 포함하지 않으므로 같은 날짜에 2 번씩 아래에 설명 된대로 값이 동일합니다.
var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true
분명히이 질문의 다른 곳에 표현 된 시간대 문제 중 일부는 유효하지만 많은 시나리오에서 관련이 없습니다.
fp_incr (0)을 사용할 수 있습니다. 시간대 부분을 자정으로 설정하고 날짜 객체를 반환합니다.
'Programming' 카테고리의 다른 글
안드로이드 : 키보드 입력 버튼이 "검색"이라고 말하고 클릭을 처리하는 방법은 무엇입니까? (0) | 2020.02.29 |
---|---|
대괄호 사이에서 텍스트를 추출하는 정규식 (0) | 2020.02.29 |
JavaScript에서 URL의 호스트 이름 부분을 추출하는 방법 (0) | 2020.02.29 |
UIButton에 여러 줄 텍스트를 어떻게 추가합니까? (0) | 2020.02.29 |
Android Studio : / dev / kvm 기기 권한이 거부되었습니다. (0) | 2020.02.29 |