시간 프레임으로 이벤트를 정의 할 수있는 응용 프로그램을 만들고 있습니다. 사용자가 시작일을 선택하거나 변경할 때 종료일을 자동으로 채우고 싶습니다. 그러나 두 시간의 차이를 얻는 방법과 그 차이를 사용하여 새로운 종료 날짜를 만드는 방법을 알 수 없습니다.
답변
JavaScript에서 날짜는 getTime()
메소드 를 호출하여 epoc 이후 밀리 초 수로 변환 하거나 숫자 표현식에서 날짜를 사용하여 .
따라서 차이를 얻으려면 두 날짜를 빼면됩니다.
차이를 기반으로 새 날짜를 만들려면 생성자에 밀리 초 수를 전달하면됩니다.
var oldBegin = ...
var oldEnd = ...
var newBegin = ...
var newEnd = new Date(newBegin + oldEnd - oldBegin);
이것은 작동합니다
편집 : @bdukes가 지적한 버그 수정
수정 :
동작에 대한 설명 oldBegin
, oldEnd
그리고 newBegin
있습니다 Date
인스턴스. 연산자를 호출 +
하고 -
Javascript 자동 캐스팅을 트리거하고 valueOf()
해당 개체 의 프로토 타입 메서드를 자동으로 호출 합니다. valueOf()
메서드가에 Date
대한 호출로 객체 에서 구현되는 경우가 발생합니다 getTime()
.
그래서 기본적으로: date.getTime() === date.valueOf() === (0 + date) === (+date)
답변
JavaScript는 즉시 날짜 차이를 완벽하게 지원합니다.
var msMinute = 60*1000,
msDay = 60*60*24*1000,
a = new Date(2012, 2, 12, 23, 59, 59),
b = new Date("2013 march 12");
console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');
이제 몇 가지 함정이 있습니다. 이 시도:
console.log(a - 10);
console.log(a + 10);
따라서 숫자와 날짜를 추가 할 위험이있는 경우 날짜를 number
직접 변환하십시오 .
console.log(a.getTime() - 10);
console.log(a.getTime() + 10);
내 첫 번째 예제는 Date 객체의 힘을 보여 주지만 실제로는 시한 폭탄처럼 보입니다.
답변
var date1 = new Date();
var date2 = new Date("2025/07/30 21:59:00");
//Customise date2 for your required future time
showDiff();
function showDiff(date1, date2){
var diff = (date2 - date1)/1000;
diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";
setTimeout(showDiff,1000);
}
HTML 코드 :
<div id="showTime"></div>
답변
당신은 시간 구성 요소에 대해 상관하지 않을 경우 사용할 수 있습니다 .getDate()
및 .setDate()
단지 날짜 부분을 설정할 수 있습니다.
따라서 종료일을 시작일로부터 2 주 후로 설정하려면 다음과 같이하십시오.
function GetEndDate(startDate)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate()+14);
return endDate;
}
두 날짜 간의 차이 (일)를 반환하려면 다음과 같이하십시오.
function GetDateDiff(startDate, endDate)
{
return endDate.getDate() - startDate.getDate();
}
마지막으로 2nd에서 반환 된 값을 매개 변수로 사용할 수 있도록 첫 번째 함수를 수정 해 보겠습니다.
function GetEndDate(startDate, days)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate() + days);
return endDate;
}
답변
감사합니다 @ Vincent Robert , 실제로는 기본 예제를 사용하여 끝냈습니다 newBegin + oldEnd - oldBegin
. 다음은 단순화 된 최종 솔루션입니다.
// don't update end date if there's already an end date but not an old start date
if (!oldEnd || oldBegin) {
var selectedDateSpan = 1800000; // 30 minutes
if (oldEnd) {
selectedDateSpan = oldEnd - oldBegin;
}
newEnd = new Date(newBegin.getTime() + selectedDateSpan));
}
답변
필요에 따라이 함수는 2 일 간의 차이를 계산하고 소수점 일수로 결과를 반환합니다.
// This one returns a signed decimal. The sign indicates past or future.
this.getDateDiff = function(date1, date2) {
return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}
// This one always returns a positive decimal. (Suggested by Koen below)
this.getDateDiff = function(date1, date2) {
return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}
답변
moment.js를 사용하는 경우 한 줄의 코드로 날짜 차이를 제공하는 더 간단한 솔루션이 있습니다.
moment(endDate).diff(moment(beginDate), 'days');
자세한 내용은 moment.js 페이지 에서 확인할 수 있습니다 .
건배, Miguel