JavaScript Date 객체에 30 분을 추가하는 방법은 무엇입니까?


784

다른 Date 객체보다 30 분 늦은 Date 객체를 얻고 싶습니다. JavaScript로 어떻게합니까?


1
내가 JS에있는 작은 달력 팝업 스크립트를 구축, 자사가에 Github에서 , 어쩌면 날짜 오브젝트가 interected 방법을 확인하기 위해 코드를 찾습니다. 또한 Javascript Kit 을 특히 날짜 객체에 대한 멋진 js 참조로 확인하십시오 .
Christian

2
변형을 사용하는 아래의 모든 답변 date.setMinutes(date.getMinutes() + ...)은 일광 절약 경계를 넘지 못합니다. 예를 들어 ( '2014-03-09'는 일광 절약 시간 경계라고 가정) : var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); d이제 30 분 전보다 늦 습니다 f.
Spig

1
@Spig : DST 경계에서 오전 1:59 후 30 분은 오전 1:29입니다. 오류가 없습니다. 당신이 인쇄하는 경우 fd, 당신은 하나라고 볼 수 있습니다 "GMT-0500은"다른 하나는 "GMT-0400"라고 (또는 시간대가 무엇이든). 전화 할 경우에도 .getTime()모두 fd, 당신은이 볼 f보다 큰 d(즉 이상).
Kip

1
@ 돼지 : 흥미롭고 Firefox에서 시도해 보았습니다. getMinutes ()가 작동하는 방식의 사양에서 회색 영역에 해당한다고 생각합니다. "봄 앞으로"는 존재하지 않는 01:8902:29입니다. Chrome은 01:29FF를 결정 해야한다고 결정합니다 03:29. "폴백"하는 밤에 두 브라우저 모두 "폴백"시간을 건너 뛰고 90 분 정도 앞으로 이동합니다 02:29. 다음은 JSFiddle 데모입니다 : "spring forward" / "fall back"
Kip

1
아래 답변 중 하나가 귀하의 질문에 대한 답변으로이 사이트의 작동 방식에 따라 귀하는 그 답변을 "수락"할 것입니다 . . 그러나 귀하의 질문에 실제로 답변 한 경우에만 가능합니다. 그렇지 않은 경우 질문에 더 자세한 내용을 추가하십시오.
Goodbye StackExchange

답변:


951

라이브러리 사용

많은 날짜 작업을 수행하는 경우 Datejs 또는 Moment.js 와 같은 JavaScript 날짜 라이브러리를 살펴볼 수 있습니다 . 예를 들어 Moment.js의 경우 다음과 같습니다.

var newDateObj = moment(oldDateObj).add(30, 'm').toDate();

바닐라 자바 ​​스크립트

이것은 혼돈의 대답 과 같지만 한 줄에 있습니다.

var newDateObj = new Date(oldDateObj.getTime() + diff*60000);

시간과 diff원하는 시간의 차이는 어디에 있습니까 oldDateObj? 부정적 일 수도 있습니다.

또는 여러 곳에서이 작업을 수행해야하는 경우 재사용 가능한 기능으로 :

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

그리고 이것이 분명하지 않은 경우에, 우리가 몇 분을 곱한 이유는 60000분을 밀리 초로 변환하는 것입니다.

바닐라 자바 ​​스크립트에주의하십시오. 데이트는 어렵다!

내일 날짜를 얻기 위해 날짜에 24 시간을 추가 할 수 있다고 생각할 수 있습니다. 잘못된!

addMinutes(myDate, 60*24); //DO NOT DO THIS

사용자가 일광 절약 시간을 준수하면 하루가 반드시 24 시간 인 것은 아닙니다. 일년에 하루 23 시간, 하루에 25 시간입니다. 예를 들어 2014 년 11 월 2 일 자정 이후 24 시간 동안 대부분의 미국과 캐나다에서 여전히 11 월 2 일입니다.

const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!

이런 이유로 많은 작업을 수행해야하는 경우 위에서 언급 한 라이브러리 중 하나를 사용하는 것이 더 안전한 방법 입니다.

아래는 내가 작성한이 기능의보다 일반적인 버전입니다. 여전히 라이브러리를 사용하는 것이 좋지만 프로젝트에 과도하거나 불가능할 수 있습니다. 구문은 MySQL DATE_ADD 함수를 따라 모델링 됩니다.

/**
 * Adds time to a date. Modelled after MySQL DATE_ADD function.
 * Example: dateAdd(new Date(), 'minute', 30)  //returns 30 minutes from now.
 * https://stackoverflow.com/a/1214753/18511
 * 
 * @param date  Date to start with
 * @param interval  One of: year, quarter, month, week, day, hour, minute, second
 * @param units  Number of units of the given interval to add.
 */
function dateAdd(date, interval, units) {
  if(!(date instanceof Date))
    return undefined;
  var ret = new Date(date); //don't change original date
  var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
  switch(String(interval).toLowerCase()) {
    case 'year'   :  ret.setFullYear(ret.getFullYear() + units); checkRollover();  break;
    case 'quarter':  ret.setMonth(ret.getMonth() + 3*units); checkRollover();  break;
    case 'month'  :  ret.setMonth(ret.getMonth() + units); checkRollover();  break;
    case 'week'   :  ret.setDate(ret.getDate() + 7*units);  break;
    case 'day'    :  ret.setDate(ret.getDate() + units);  break;
    case 'hour'   :  ret.setTime(ret.getTime() + units*3600000);  break;
    case 'minute' :  ret.setTime(ret.getTime() + units*60000);  break;
    case 'second' :  ret.setTime(ret.getTime() + units*1000);  break;
    default       :  ret = undefined;  break;
  }
  return ret;
}

jsFiddle 데모 작업 .


14
이것은 매우 강력합니다. 숫자가 음수 인 경우에도 몇 분 동안 작동합니다.
와히드 비 타르

3
몇 초 동안 60k 대신 1000을 곱하십시오.
ashes999

2
dateAdd () 함수는 훌륭합니다! 그러나 나에게 한 가지 메모가 있습니다-의미 적으로 단위 는 "분", "초"등 이어야하며 간격 은 그 반대가 아닌 양 (2, 10, 45, ...)이어야합니다. 그렇지 않으면 아이디어가 좋습니다.
Vasil Popov

1
이 답변은 월 롤오버를 수용하지 않으므로 1 월 31 일 + 1 개월은 윤년인지 여부에 따라 2 월 또는 3 월을 제공합니다. Jacobi의 답변에 있는 addMonthsaddYears 함수는이를 처리하므로 더 나은 답변입니다.
RobG

1
@RobG 좋은 지적입니다. 이에 대한 수정 사항을 추가했으며 "가능한 경우 라이브러리 사용"요점을 더욱 강조했습니다.
Kip

238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );

114
@Jamie : 두 개의 Date객체 가 필요하지 않습니다 . var d = new Date(); d.setMinutes(d.getMinutes() + 30);
그랜트 바그너

15
@Grant : 나는 d2 = "나는 Date 객체를 얻고 싶다"고 d1 = "다른 Date 객체로"
Jamie

7
@CKeene, setMinutes 및 getMinutes는 일반 오래된 Javascript의 일부입니다 (datejs는 다른 많은 것들을 제공하지만).
s29

4
참고로 일광 절약 시간제 경계를 넘을 수 있습니다. JSFiddle 데모 : "spring forward" / "fall back" (@Spig에게 감사드립니다)
Kip

@trevorgrayson 지정한 매개 변수가 예상 범위를 벗어나면 setMinutes ()는 날짜 정보를 적절하게 업데이트하려고 시도합니다. 예를 들어 100을 사용하면 시간이 1 씩 증가하고 40이 분 동안 사용됩니다.
Mihai Crăiță

155

var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);


3
setTime날짜 개체가 아닌 숫자 밀리 초 타임 스탬프 를 반환합니다. (한 줄짜리를 할 수 있다고 생각하지 마십시오.)
Alan H.

12
var in30Mins = new Date(+new Date() + 1.8e6)1- 라이너이지만 2- 라이너보다 낫다는 것을 확신하지 못합니다. ;-)
RobG

112

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);


9
이 사본을 게시했습니다. 삭제하고 +1했습니다.
Izzy

3
이 질문에 대한 가장 간단한 답변
vijay

setMinutes타임 스탬프를 반환 한다고 생각 하지만 개체 now는 그대로 유지 Date되므로 now = new Date(now)더 이상 사용되지 않습니다
p.boiko

46

아마도 이런 식으로 뭔가?

var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);

console.log(v)


6
@ Chacha102 : 두 개의 Date객체 가 필요하지 않습니다 . var d = new Date(); d.setMinutes(d.getMinutes() + 30);
그랜트 바그너

12
그는 두 개의 날짜 개체를 원했습니다. 질문을 읽으십시오. 다른 날짜 개체보다 30 분 앞서는 한 날짜 개체
Tyler Carter

5
한 시간이 지난 후에도 정상적으로 작동합니까? 11시 59 분에 전화하면 12시 29 분에 예약됩니까?
Chris Rae

1
@ChrisRae 네, 그렇습니다. If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
fridoo

35

JS에서 날짜와 함께 작동하도록 addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears와 같은 7 개의 함수를 항상 만듭니다.

예를 볼 수 있습니다 : http://jsfiddle.net/tiagoajacobi/YHA8x/

사용하는 방법:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

이것은 기능입니다 :

        Date.prototype.addSeconds = function(seconds) {
            this.setSeconds(this.getSeconds() + seconds);
            return this;
        };

        Date.prototype.addMinutes = function(minutes) {
            this.setMinutes(this.getMinutes() + minutes);
            return this;
        };

        Date.prototype.addHours = function(hours) {
            this.setHours(this.getHours() + hours);
            return this;
        };

        Date.prototype.addDays = function(days) {
            this.setDate(this.getDate() + days);
            return this;
        };

        Date.prototype.addWeeks = function(weeks) {
            this.addDays(weeks*7);
            return this;
        };

        Date.prototype.addMonths = function (months) {
            var dt = this.getDate();

            this.setMonth(this.getMonth() + months);
            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };

        Date.prototype.addYears = function(years) {
            var dt = this.getDate();

            this.setFullYear(this.getFullYear() + years);

            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };

누구든지이 방법으로 문제를 볼 수 있습니까?
Dembinski

1
대신 moment.js를 사용하십시오
Victor Pudeyev 23시 36 분

@TheDembinski – 어떤 문제가 예상됩니까? 기본 제공 확장은 일반적으로 싫어하지만 Date에 문제가 없습니다. 각 주요 증분이 선택적으로 작은 증분을 설정하는 경우 ( set * 방법과 같이), addHours에 선택적으로 분, 초 및 밀리 초가 걸리므로date.addHours(3, 30) 3 시간 30 분을 추가 할 수 있습니다. addYears 는 몇 년, 몇 개월, 며칠, addMonths 는 몇 달 및 며칠, addMinutes 는 몇 분, 초, 밀리 초 등이 소요됩니다.
RobG

1
안녕하세요 @transformer이 같은 일을 할 것입니다 new Date().addHours(4).addMinutes(45);. 메서드는 현재 Date 개체 인 "this"를 반환하기 때문에 원하는만큼 호출 할 수 있습니다.
Jacobi

1
@transformer 안녕하세요, 전, 나는 확실히 나는 당신의 문제를 이해 아니지만,이 프로토 타입 기능, 당신은 당신이 원하는 임의의 순서로 사용할 수 있습니다 : var dt = new Date();다음 dt.addMinutes(45); dt.addHours(4);심지어 dt.addMinutes(285);나 또한 dt.addMinutes(45).addHours(4);모든 의지 작업. 코드 예제에 대한 질문이 있으시면 여기에 문제를 게시하여 기꺼이 도와 드리겠습니다.
Jacobi

13

해결하는 가장 쉬운 방법은 자바 스크립트 날짜가 숫자 일뿐임을 인식하는 것입니다. 0또는 시작합니다 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). 모두 1는 밀리 초를 나타냅니다. 값을 가져와 해당 값을 사용하여 새 날짜를 인스턴스화하여 밀리 초를 더하거나 뺄 수 있습니다. 그 마음으로 쉽게 관리 할 수 ​​있습니다.

const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));

console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)

10

이것은 내가 잘하는 것처럼 보입니다.

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

그런 다음 다음과 같이 호출하면됩니다.

var now = new Date();
console.log(now.addMinutes(50));

2
당신은 할 수 있습니다 return new Date(this.getTime() + minutes * 60000);, 나는 중간에 copyDate 가 필요하지 않습니다. ;-)
RobG

5

ES6 버전 은 다음과 같습니다 .

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

다음과 같이 호출하십시오.

getTimeAfter30Mins();

4:30 hr + 2:15 hrs / mins를 입력하는 사용자가 있는데, 시간과 분을 통과시켜 기존 시간 분에 추가하는 방법은 무엇입니까?
트랜스포머

@transformer 당신은 숫자 유효성 검사를하는 등 시간, 분 등 다른 입력 필드를 제공 할 수 있습니다.
xameeramir

5

여기에 많은 답변에 창의적인 구성 요소가 없으며 시간 여행 계산에 매우 필요하다고 생각합니다. 나는 30 분의 시간적 번역에 대한 해결책을 제시한다.

(jsfiddle 여기 )

function fluxCapacitor(n) {
    var delta,sigma=0,beta="ge";
    (function(K,z){

        (function(a,b,c){
            beta=beta+"tT";
            switch(b.shift()) {
                case'3':return z('0',a,c,b.shift(),1);
                case'0':return z('3',a,c,b.pop());
                case'5':return z('2',a,c,b[0],1);
                case'1':return z('4',a,c,b.shift());
                case'2':return z('5',a,c,b.pop());
                case'4':return z('1',a,c,b.pop(),1);
            }
        })(K.pop(),K.pop().split(''),K.pop());
    })(n.toString().split(':'),function(b,a,c,b1,gamma){
       delta=[c,b+b1,a];sigma+=gamma?3600000:0; 
       beta=beta+"im";
    });
    beta=beta+"e";
    return new Date (sigma+(new Date( delta.join(':')))[beta]());
}

나는 이것이 창조적이라는 것을 인정해야한다. 그러나 사람 .. 이것은 읽기 어렵다!
Erik Baan

2

나처럼 게으른 사람을 위해 :

커피 스크립트에서 "enum"을 사용하고 동일한 객체에서 작동하는 Kip의 답변 (위에서) :

Date.UNIT =
  YEAR: 0
  QUARTER: 1
  MONTH: 2
  WEEK: 3
  DAY: 4
  HOUR: 5
  MINUTE: 6
  SECOND: 7
Date::add = (unit, quantity) ->
  switch unit
    when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
    when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
    when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
    when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
    when Date.UNIT.DAY then @setDate(@getDate() + quantity)
    when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
    when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
    when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
    else throw new Error "Unrecognized unit provided"
  @ # for chaining

2

시간 계산 처리와 관련된 문제를 처리하는 것으로 알려진 기존 라이브러리를 사용하십시오. 내가 가장 좋아하는 것은 moment.js 입니다.

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
 var now = moment(); // get "now"
 console.log(now.toDate()); // show original date
 var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
 console.log(thirty.toDate()); // show new date
</script>

3
이유를 제시하지 않고 공감하면 답변을 개선 할 수 없습니다.
Ouroborus

OP는 프레임 워크 / 라이브러리가 아닌 JavaScript 솔루션을 요청했습니다.
mattpark22

2
@ mattpark22 내가 얻는 것을 이해하는 동안 Javascript 라이브러리는 여전히 Javascript입니다. 라이브러리의 관련 부분 만 제거하고 코드 솔루션으로 제시 할 수 있습니다. OP는 당신이 그것을 의미한다는 의미에서 자바 스크립트라는 대답을 할 것이지만, 수용 가능한 범용 솔루션을 알지 못할 것입니다. 또한 Date 객체가 처리하지 않는 많은 경우가 있기 때문에 30 분을 추가하는 것이 대부분의 대답이 들리는 것처럼 사소한 것은 아닙니다. 예를 들어 DST 경계를 넘을 때 가장 인기있는 답변이 중단됩니다.
Ouroborus

@Ouroborus – OP가 OP 또는 태그의 라이브러리를 요청하지 않은 경우 라이브러리가 제공되는 유일한 솔루션이되어서는 안됩니다. 그렇지 않으면 답변은 다른 라이브러리에서 무언가를 수행하는 간단한 방법이 될 수 있으며 OP는 실제 문제에 현명하게 남지 않습니다 (이 경우 해결하기가 쉽지 않습니다).
RobG

1
@RobG 아무도 도서관 솔루션 만 제공해야한다고 제안하지 않습니다. OP는 질문을 주제에 맞지 않게 만들 수있는 라이브러리를 구체적으로 요청할 수 없습니다. "자바 스크립트로 어떻게합니까?" 이는 제목과 태그에서이 세부 사항이 반복되는 경우 특히 자바 스크립트에만 해당됨 (원시 코드 솔루션을 요구하는 대신 특정 언어의 솔루션을 요구함)을 지정하는 것으로 해석 될 수 있습니다.
Ouroborus 2016 년

1

내가 쓴 또 다른 옵션 :

DP_DateExtensions 라이브러리

이것이 당신이 필요한 모든 날짜 처리라면 과잉이지만, 당신이 원하는 것을 할 것입니다.

날짜 / 시간 형식, 날짜 수학 (날짜 부분 추가 ​​/ 빼기), 날짜 비교, 날짜 구문 분석 등을 지원합니다. 공개적으로 공개됩니다.


1

당신은 이것을 할 수 있습니다 :

let thirtyMinutes = 30 * 60 * 1000; // convert 30 minutes to milliseconds
let date1 = new Date();
let date2 = new Date(date1.getTime() + thirtyMinutes);
console.log(date1);
console.log(date2);



1

현재 날짜의 값을 가져 와서 (ms)로 날짜를 가져 와서 (30 * 60 * 1000) 추가해야합니다. 이제 당신은 ms와 (현재 날짜 + 30 분)

console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))


0

주제가 너무 오래되었다는 것을 알고 있습니다. 그러나 나는 여전히 이것을 필요로하는 일부 개발자가 있다고 확신 하므로이 간단한 스크립트를 만들었습니다. 나는 당신이 그것을 즐기시기 바랍니다!

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45, //Adding fourty five minutes
    seconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.
});
<button onclick="alert(futureDate)">Travel to the future</button>

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