오늘 3 개월 전에 JavaScript로 날짜를 어떻게 계산합니까?


147

현재 날짜보다 3 개월 전인 날짜를 만들려고합니다. 아래 코드로 현재 달을 얻습니다.

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

Date월이 1 월 (1) 일 때 날짜가 3 월 전에 10 월 (10) 일 것이라는 점을 고려 하여 날짜 ( 데이터 유형 의 객체)를 계산하고 형성하는 논리를 제공 할 수 있습니까 ?

답변:


323
var d = new Date();
d.setMonth(d.getMonth() - 3);

이것은 1 월에 작동합니다. 이 스 니펫을 실행하십시오.

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());


몇 가지주의 사항이 있습니다 ...

한달은 호기심 많은 것입니다. 1 개월을 어떻게 정의합니까? 30 일? 대부분의 사람들은 한 달 전에 전 달의 인용 과 같은 날을 의미한다고 말할 것입니다 . 그러나 30 일이 아닌 30 일 전의 절반 이상인 30 일입니다. 그리고 오늘이 해당 월의 31 일 (8 월 또는 12 월이 아님) 인 경우 해당 월의 해당 날짜는 이전 달에 존재하지 않습니다.

흥미롭게도 Google 은 사용자가 하루 전날 을 요청하면 JavaScript에 동의합니다 .

'3 월 31 일 전 1 개월'에 대한 Google 검색 결과에 '3 월 3 일'이 표시됩니다.

또한 한 달은 30.4167 일 이라고 말합니다 . '1 개월 만에'에 대한 Google 검색 결과에 '30 .4167 '이 표시됩니다.

3 월 31 일 이전의 한 달이 3 일 전인 3 월 28 일 이전의 한 달과 같은 날입니까? 이것은 모두 "한 달 전"의 의미에 달려 있습니다. 제품 소유자와 대화하십시오.

momentjs처럼하고 싶고 월 마지막 날로 이동하여 마지막 달 오류를 수정하려면 다음과 같이 할 수 있습니다.

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

요구 사항이 그보다 복잡하면 수학을 사용하고 코드를 작성하십시오. 당신은 개발자입니다! 라이브러리를 설치할 필요가 없습니다! stackoverflow에서 복사하여 붙여 넣을 필요가 없습니다! 필요한 것을 정확하게 수행하기 위해 코드를 직접 개발할 수 있습니다!


var currentDate = 새 날짜 (); var currentMonth = currentDate.getMonth () -12; var pastDate = 새 날짜 (2011, currentMonth, 01); 경고 (pastDate); 이 작업은 12 개월로 확인되었습니다
KeenUser

이것은 나쁜 대답입니다 ... 어디서 2012,0,15를 얻을 수 있습니까? 기존 월을 -1로 변환 하시겠습니까?
Alex G

3
@AlexG-JavaScript 날짜 구문 분석을 처음 사용하는 경우 빠른 예제가 어떻게 혼란 스러울 지 알 수 있습니다. JavaScript는 월을 0 기반으로 표시하며 1 월은 0입니다. 이러한 혼란을 피하기 위해, 특히 질문이나 대답과 관련이 없기 때문에 문자열에서 날짜를 가져 오기 위해 데모를 업데이트했습니다. 이는보다 직관적이어야합니다.
gilly3

7
나는 이것이 오래된 것을 알고 있지만 날짜가 3 월 31 일 이고이 방법을 사용하여 1 개월을 빼면 결과는 3 월 2 일입니다. jsfiddle.net/atamata/rvumf7dg
atamata

@ atamata-그래, 이상하지만 예측 가능하고 예상됩니다. 3 월의 전월 말 후 31 일은 3 월 31 일이지만 2 월은 3 월 2 일입니다. 월말부터 계산하려면 해당 사용자 지정 코드를 작성해야합니다.
gilly3

28

Moment.js라는 라이브러리를 사용하는 것이 좋습니다.

잘 테스트되고 크로스 브라우저와 서버 측에서 작동합니다 (Angular 및 Node 프로젝트 모두에서 사용하고 있습니다). 로케일 날짜를 크게 지원합니다.

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format()ISO 8601 형식으로 형식화 된 날짜의 문자열 표현을 리턴 합니다. 다음과 같이 사용자 정의 날짜 형식으로 사용할 수도 있습니다..format('dddd, MMMM Do YYYY, h:mm:ss a')


10

변수에 직접 넣을 수있는 "하나의 라이너"(쉽게 읽을 수 있도록 여러 줄에 있음) :

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);

좋은! 모든 시나리오에 적용 가능한지 확실하지 않지만 제대로 작동하는 것 같습니다.
Devin Fields

8

정말 간단하게하기 위해 JavaScript 용 날짜 라이브러리 인 DateJS를 사용할 수 있습니다.

http://www.datejs.com/

당신을위한 예제 코드 :

Date.today().add({ months: -1 });

8

이것은 더하기 / 빼기를 ​​처리해야합니다. 빼기 위해 음수 값을 넣고 더하기 양수 값을 넣으십시오. 이것은 또한 월간 크로스 오버 문제를 해결합니다.

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}

6

setMonthgilly3가 제공 하는 방법이 원하는 것이 아닌 경우 다음을 고려하십시오.

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

여러 시간 동안 사용할 수 있으며 올바른 배수를 설정하기 만하면됩니다.


gilly3의 대답을 따르겠습니다. 당신은 한 달에 고정 된 초 수를 가정합니다. JavaScript의 관대 한 날짜 산술은 하루를 올바르게 유지합니다. 9 월 28 일 이전의 3 개월은 7 월 28 일이어야합니다.
Ray Toal

1
JavaScript가 3 월 31 일에서 1 개월을 뺀 것으로 계산하는 것이 궁금합니다.
암흑의 절대 군 니트

1
이 경우 2 월 31 일이 관대 모드이므로 3 월 3 일 (2011 년)이됩니다. 그러나 2 개월을 빼면 1 월 31 일이됩니다. 월 28 일 모델에서는 그렇지 않습니다. Date클래스가 약하고 Date.js가 선호되는 한, 최소한 캐주얼에 사용하기에 적합한 관대 한 발음 달력을 모델링합니다.
Ray Toal

1000 초에서 여러 초로 올바르게 설정해서는 안 setTime()됩니까?
Vlad Tsepelev

4

나는 gilly3의 대답 의 단순함을 좋아 하지만 사용자는 3 월 31 일 이전의 달이 3 월 3 일이라는 사실에 놀라게 될 것입니다. 31 년은 윤년이 아닌 2 월 28 일입니다.

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');


2

이미 우아한 대답이 있지만 읽기가 어렵다는 것을 알았으므로 직접 기능을 수행했습니다. 내 목적을 위해 부정적인 결과가 필요하지는 않았지만 수정하기는 어렵지 않습니다.

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }

2

var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());


1

가장 작고 쉬운 코드입니다.

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

현재 날짜가있는 변수를 선언하십시오. 그런 다음 setMonth 내장 함수를 사용하여 3 개월 전 날짜를 얻을 수 있습니다.


-1

내 경우에는 1 개월을 현재 날짜로 빼야했습니다. 중요한 부분은 월 번호 였으므로 현재 달의 어느 날에 상관하지 않으므로 지난 달이 필요했습니다. 이것은 내 코드입니다.

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

실제 날짜까지 1 개월 빼기 정확하지 않기 때문에 첫 번째 장소에서 매월 1 일을 설정하고 (첫 번째 날은 항상 첫날입니다) 두 번째 장소에서는 1 일을 빼서 항상 지난 달로 보냅니다. 당신을 도울 수 있도록 노력하겠습니다.

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)


-1

   

 var date=document.getElementById("date");
    var d = new Date();
   document.write(d + "<br/>");
    d.setMonth(d.getMonth() - 6);
    document.write(d);

 if(d<date)
  document.write("lesser then 6 months");
else
  document.write("greater then 6 months");


-1

JS Date 객체와 더하기 / 빼기를 ​​원하는 개월 수의 정수를 전달하십시오. monthsToAdd긍정적이거나 부정적 일 수 있습니다. JS 날짜 객체를 반환합니다.

귀하 originalDateObject가 3 월 31 일이고 다음과 같이 -1을 전달하면monthsToAdd 출력 날짜는 2 월 28 일입니다.

36 개월이라고 말하면 많은 달을 통과하면 연도 조정도 올바르게 처리합니다.

const addMonthsToDate = (originalDateObject, monthsToAdd) => {
  const originalDay = originalDateObject.getUTCDate();
  const originalMonth = originalDateObject.getUTCMonth();
  const originalYear = originalDateObject.getUTCFullYear();

  const monthDayCountMap = {
    "0": 31,
    "1": 28,
    "2": 31,
    "3": 30,
    "4": 31,
    "5": 30,
    "6": 31,
    "7": 31,
    "8": 30,
    "9": 31,
    "10": 30,
    "11": 31
  };

  let newMonth;
  if (newMonth > -1) {
    newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
  } else {
    const delta = (monthsToAdd * -1) % 12;
    newMonth = originalMonth - delta < 0 ? (12+originalMonth) - delta : originalMonth - delta;
  }

  let newDay;

  if (originalDay > monthDayCountMap[newMonth]) {
    newDay = monthDayCountMap[newMonth].toString();
  } else {
    newDay = originalDay.toString();
  }

  newMonth = (+newMonth + 1).toString();

  if (newMonth.length === 1) {
    newMonth = '0' + newMonth;
  }

  if (newDay.length === 1) {
    newDay = '0' + newDay;
  }

  if (monthsToAdd <= 0) {
    monthsToAdd -= 11;
  }

  let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;

  let newTime = originalDateObject.toISOString().slice(10, 24);

  const newDateISOString = `${newYear}-${newMonth}-${newDay}${newTime}`;

  return new Date(newDateISOString);
};

-5
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:

   <!DOCTYPE html>
<html>
<body>

<p>Click the button to display the date after changing the month.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {

var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);

OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate()  )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);

}

    document.getElementById("demo").innerHTML = d;
}
</script>

</body>
</html>

이 답변은 이미 존재하는 다른 오래된 답변 7과 어떻게 다릅니 까?
Stephen Rauch

-5

var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);

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