JavaScript에서 날짜에서 일 빼기


603

누구든지 데이트를하는 쉬운 방법을 알고 있습니까 (예 : 오늘) X 일로 돌아가는가?

예를 들어 오늘 5 일 전의 날짜를 계산하려면


4
수락 된 답변을 사용하여 문제를 발견했습니다. setDate ()에서 음수 값을 사용하면 예상대로 작동하지 않습니다. 다른 (더 나은) 솔루션에 대해서는 stackoverflow.com/a/9037132/792287 을 참조하십시오 .
vandiedakaf


답변:


961

다음과 같이 해보십시오 :

 var d = new Date();
 d.setDate(d.getDate()-5);

이렇게하면 날짜 개체가 수정되고 업데이트 된 날짜의 시간 값이 반환됩니다.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());


9
그 결과는 긴 정수 문자열을 제공합니다. 그것을 05/14/2012로 포맷하는 방법에 대한 아이디어가 있습니까?
user525146

162
이것이 Google의 상단에 있다고 가정하면 위의 의견에 답할 것이라고 생각합니다. new Date(new Date().setDate(new Date().getDate()-5))-5 일 전입니다. 답의 예에서 새 날짜로 전달하여 날짜 객체를 가져옵니다. 그래서 new Date(d)당신이 원하는 것입니다.
Jesse

8
이것의 문제는 날짜로 유효한 값이 아닌 00으로 끝날 수 있다는 것입니다.
DominicM

24
setDate(-1)날짜를 해당 월의 마지막 날로 설정합니다
Peter

5
@ user525146은 숫자가 아닌 숫자의 형식을 지정하는 방법을 물었습니다. 답답한 답변이 필요 없습니다. 숫자, 날짜의 사용 한 서식을 지정하려면 toString같은 방법 toISOString, toDateString
잘못된 요청

83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

웹 응용 프로그램 전체에서 많은 헤드 데이트 날짜 조작을 수행하는 경우 DateJS 를 사용하면 훨씬 쉽게 생활 할 수 있습니다.

http://simonwillison.net/2007/Dec/3/datejs/


23
엣지 케이스이지만 일광 절약 시간의 시작 / 끝에서 실패 할 수 있습니다. 5 일을 빼지 않고 5 * 24 시간을 뺀 것입니다. 일광 절약 시간의 첫날은 23 시간이며 마지막은 25 시간입니다. 일반적으로 중요하지 않지만 고려해야 할 사항입니다.
Kip

11
@Kip 나는 일광 절약 시간과 시간대를 싫어합니다. 우리는 모두 GMT로 이동해야합니다.
cwallenpoole

6
@cwallenpoole은 거품을 터뜨리지 않지만 그리니치에서도 DST를 사용합니다. 따라서 GMT를 원한다면 아이슬란드와 서 아프리카 일부 국가로 제한됩니다.
Kip

1
이 방법의 문제점은 새해 등에서는 작동하지 않는다는 것입니다.
Daniel Williams

4
@danielWilliams 새해에는 어떻게 작동하지 않습니까? getTime()그리고 setTime()신기원 밀리 세컨드입니다. 시간이 1 년을 넘더라도 문제가되지 않습니다.
Mashmagar

52

다음과 같이 진행됩니다.

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);

그 결과는 긴 정수 문자열을 제공합니다. 그것을 05/14/2012로 포맷하는 방법에 대한 아이디어가 있습니까?
user525146

7
d.setDate의 반환 값은 실제로 정수 값입니다. 그러나 "d"의 실제 값이 수정되었으므로이 시점에서 실제로는 리턴 값에 관심이 없습니다. 실제 질문은 이제 날짜 형식을 지정하는 방법입니다. 현재 날짜는 "d"이며 setDate의 반환 값이 아닙니다. (실제로는 반환 값이지만, 그 시점의 날짜가 아니며 혼동하고 싶지 않습니다. d를 사용하면 더 빠를 것입니다). 날짜 형식을 지정하려면 d.getMonth (), d.getFullYear () 및 d.getDate () 메소드가 필요합니다. 월은 0이기 때문에 당신은 d.getMonth ()에 하나를 추가 할
크리스 닐슨

2
간단한 방법 : function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};그저var daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjak 물론 당신이 월말을 시작하면 시작됩니다. 왜 작동하지 않습니까?
Chris Nielsen

23

getDays + X가 일 / 월 경계에서 작동하지 않는 것으로 나타났습니다. 날짜가 1970 년 이전이 아닌 한 getTime을 사용할 수 있습니다.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));

3
나는 똑같이 알아 차렸다. 더 놀라지 않았거나 무언가를 놓치고 있습니까?
Sean Glover

11
이것은 올바르지 않습니다. new Date (). setDate (-1)은 전월의 마지막 날을 알려줍니다.
zbrunson

2
일광 절약 시간제 시작 / 종료의 경우에는 올바르지 않습니다. 귀하의 접근 방식은 매일 24 시간이 있다고 가정하여 7 * 24 시간을 뺍니다. DST의 첫 날은 23 시간이며 마지막 날은 25 시간입니다. setDate (getDate ()-7)에는이 문제가 없습니다.
Kip

1
getTime은 표준시로 작동합니다. 따라서 Date 객체에서 7 일 시간을 올바르게 뺍니다. 지정된 시간대의 문자열로 변환하면 해당 시간대의 시간이 올바르게 표시됩니다.
awjr

시간 변경 일에주의하십시오. 가을에 다시 떨어지면 그 날의 시간은 25 시간이므로 자정에서 24 시간을 빼면 같은 날에 착륙합니다. 그러나이 기술 (밀리 초 빼기)은 모든 작업 후 하루를 가장 가까운 자정으로 반올림하면 작동합니다. 먼저 12 시간을 추가 한 다음 시간을 0으로 설정하면됩니다.
Magmatic

18

moment.js를 얻으십시오. 모든 멋진 아이들이 사용합니다. 더 많은 서식 옵션 등이 있습니다.

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

선택 과목! 각도 바인딩의 경우 JS Date obj로 변환하십시오.

var date = new Date(dateMnsFive.toISOString());

선택 과목! 체재

var date = dateMnsFive.format("YYYY-MM-DD");

날짜를 순간에 전달하면 경고가 표시됩니다. 지원 중단 경고 : 제공된 값이 인식 된 RFC2822 또는 ISO 형식이 아닙니다. 모멘트 구성은 js Date ()로 돌아가며 모든 브라우저와 버전에서 신뢰할 수있는 것은 아닙니다. 비 RFC2822 / ISO 날짜 형식은 권장되지 않으며 향후 주요 릴리스에서 제거 될 예정입니다. 자세한 내용은 momentjs.com/guides/#/warnings/js-date 를 참조하십시오 .
전환

13

음수 값을 전달하여 일을 빼고 양수 값을 전달하여 일을 더할 수 있도록 Date에 대한 프로토 타입을 만들었습니다.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

그래서 그것을 사용하려면 간단히 쓸 수 있습니다.

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);

2
d.setDate(d.getDate() + days)대해 양수 및 음수 값을 모두 사용 하여 을 더하고 뺄 수 있습니다. 그리고 다른 Date 메서드와 마찬가지로 인스턴스에서 작동해야하며 복사본을 만들고 반환하지 않아야합니다.
RobG

13

기존 솔루션 중 일부는 가깝지만 정확히 내가 원하는 것은 아닙니다. 이 함수는 양수 또는 음수 값 모두에서 작동하며 경계 경우를 처리합니다.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}

2
이 방법을 사용하여 현재 달의 15 일에 20 일을 추가하면 다음 달에 '유출'됩니까? 보이지 않는 것 같습니다.
보라

2
@Bora-예, 필요한 경우 월을 올바르게 증가시킵니다. 예를 들어, 8 월 15 일에 20 일을 추가하면 addDays (new Date (2015, 07, 15), 20)는 "2015 년 9 월 4 일 금요일 00:00:00 GMT-0700 (PDT)"을 반환합니다.
Joel Fillmore

12

나는 밀리 초 단위로 수학하는 것을 좋아합니다. 그래서 사용Date.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

그리고 당신이 그것을 좋아한다면

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

참고 : Date.now()구형 브라우저에서는 작동하지 않습니다 (예 : IE8이라고 생각합니다). 여기에 폴리 필 .

2015 년 6 월 업데이트

@socketpair는 내 멍청함을 지적했습니다. "일년에는 23 시간, 시간대 규칙에 따라 약 25 시간이 있습니다"라고 말합니다.

이를 확대하기 위해 위의 답변은 일광 절약 시간제 변경이있는 시간대에서 5 일 전 현지 날짜를 계산하려는 경우 일광 절약 시간이 부정확합니다.

  • Date.now()현재의 LOCAL에 현재 시간 을 제공 한다고 잘못 가정 하거나
  • 사용하기 .toString()때문에 로컬 날짜를 반환하고와 호환되지 Date.now()UTC의 기본 날짜입니다.

그러나 UTC로 수학을 수행하는 경우 작동합니다. 예 :

A. 5 일 전 UTC 날짜를 원합니다 (UTC)

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B. 다음을 사용하여 "현재"이외의 UTC 기본 날짜로 시작합니다. Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString

3
이것은 정확하지 않습니다. 일년 중 어느 날에는 시간대 규칙에 따라 23 시간이 있고, 일부에는 25 시간이 있습니다.
socketpair

윤초가있을 때 실패 조건에 대해 걱정할 것입니다 ... 아마도 중요한 코드에는 좋지 않습니다.
robocat

12

getDate () / setDate () 메소드의 문제점은 너무 쉽게 모든 것을 밀리 초로 변환한다는 것입니다. 구문은 때로는 따라하기가 어렵습니다.

대신 1 일 = 86,400,000 밀리 초라는 사실을 해결하고 싶습니다.

따라서 특정 질문에 대해 :

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

매력처럼 작동합니다.

나는 30/60/365 일의 롤링 계산을 위해 항상이 방법을 사용합니다.

이것을 쉽게 추정하여 몇 달, 몇 년 동안 시간 단위를 만들 수 있습니다.


11

날짜를 여러 부분으로 나누고 조정 된 값으로 새 날짜를 반환하십시오.

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

월은 0부터 시작하지만 날짜는 그렇지 않습니다. 즉, 새로운 날짜 (2009, 1, 1) == 2009 년 2 월 1 일, 새로운 날짜 (2009, 1, 0) == 2009 년 1 월 31 일;


2
이런 식으로 날짜에 예를 들어 50 일을 추가하면 어떻게됩니까? 날짜를 2009 년 8 월 68 일로 설정합니까? 아니면 항상 해당 월 및 / 또는 연도로 올바르게 래핑됩니까?
Jesper

addDays, addMonths 및 addYears를 Date.prototype에 추가하는 데 사용되었습니다. 좋고 간단합니다.
Scott Isaacs

1
정답이어야합니다. 승인 된 답변이 실패한 연말 일에도 작동합니다.
kris

1에서 99까지의 연도에는 작동하지 않습니다. ;-) get *set * 메소드를 사용하는 것이 훨씬 좋습니다 .
RobG

8

두 번째 변수를 사용하지 않고 7 일을 지난 x 일로 바꿀 수 있습니다.

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))

5

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);


2

날짜 조작 기능을 만들었습니다. 며칠, 시간, 분을 더하거나 뺄 수 있습니다.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

이제 매개 변수를 전달하여이 함수를 호출하십시오. 예를 들어 오늘부터 3 일 전에 날짜를 가져 오는 함수 호출이 있습니다.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");

2

MomentJS를 사용하십시오 .

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


1

가장 인기있는 답변은 내 코드의 버그로 이어졌으며 첫 달에 현재 달의 미래 날짜가 설정됩니다. 여기 내가 한 일이 있습니다.

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time


0

나는 한 줄이기 때문에 다음을 좋아합니다. DST 변경으로 완벽하지는 않지만 일반적으로 내 요구에 충분합니다.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));

0

나를 위해 모든 조합이 코드 snipplet 아래에서 잘 작동했습니다. 스 니펫은 Angular-2 구현입니다. 일을 추가 해야하는 경우 양수 numberofDays를 전달하고 음수 numberofDays를 빼야하는 경우

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}

0

date.js에서 좋은 주행 거리를 얻습니다.

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

좋은!

웹 사이트는이 아름다움을 포함합니다 :

Datejs는 문자열을 구문 분석하지 않고 두 개로 깔끔하게 슬라이스합니다.


0

며칠을 빼고 사람이 읽을 수있는 형식으로 날짜를 형식화하려면 DateHelper다음과 같은 사용자 지정 개체를 만드는 것이 좋습니다 .

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

( 이 바이올린 참조 )


0

다음 코드를 참조하여 현재 날짜에서 요일을 뺍니다. 또한 빼기 날짜에 따라 월을 설정하십시오.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);

-1

날짜를 설정하면 날짜가 밀리 초로 변환되므로 날짜로 다시 변환해야합니다.

이 방법은 또한 새해 변화 등을 고려합니다.

function addDays( date, days ) {
    var dateInMs = date.setDate(date.getDate() - days);
    return new Date(dateInMs);
}

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );

-1

자바 스크립트를 사용할 수 있습니다.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

PHP의 경우

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

그것이 도움이되기를 바랍니다.


-1

나는 밀리 초로 변환하고 달을 빼면 달과 연도는 변경되지 않으며 논리적이지 않습니다.

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

희망은 도움이됩니다


-1

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );


1
일부 사람들은 내가하는 일을 얻지 못할 수 있으므로 항상 코드 / 응답에 대해 언급해야합니다.
Michael

-1

최신 JavaScript 함수 구문 사용

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday


-1

이런 식으로 해보십시오

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate 는 날짜가 될 수 있습니다

한계 는 일 수의 차이 일 수 있습니다 (미래에 긍정적이고 과거에 부정적)


-1

이것은 당신에게 어떤 종류의 문제도 얻지 못할 것입니다.

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

당신은 당신의 요구 사항에 따라 빼기 일을 변경할 수 있습니다



-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

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