[javascript] JavaScript의 날짜에서 일, 월, 년 빼기

데이트를하고 (예 : 오늘) X 일, X 개월, X 년으로 돌아가는 간단한 방법을 아는 사람이 있습니까?

나는 그것을 시도했다 :

var date = new Date();
$("#searchDateFrom").val((date.getMonth() -1 ) + '/' + (date.getDate() - 6) + '/' + (date.getFullYear() - 1));

그러나 나는 부정적인 날짜를 얻었습니다. 예를 들어 오늘 출력은 다음과 같습니다.

2015 년 3 월 3 일

조언이 있습니까?

감사.



답변

단순히 숫자에서 값을 줄이는 것입니다. 따라서 3 (날짜)에서 6을 빼면 -3 ​​만 반환됩니다.

날짜 개체에서 시간 단위를 개별적으로 추가 / 제거해야합니다.

var date = new Date();
date.setDate( date.getDate() - 6 );
date.setFullYear( date.getFullYear() - 1 );
$("#searchDateFrom").val((date.getMonth() ) + '/' + (date.getDate()) + '/' + (date.getFullYear()));


답변

다른 사람들이와 같은 메서드에서 반환 된 숫자 값에서 빼고 있다고 말했듯이 date.getDate()날짜 변수에서 해당 값을 재설정해야합니다. 이 작업을 수행 할 방법을 아래에 만들었습니다. new Date()현재 날짜로 초기화되는 날짜를 생성하고 전달 된 값에 따라 날짜, 월, 연도를 설정합니다. 예를 들어 6 일 뒤로 돌아가려면 -6과 같이 전달 var newdate = createDate(-6,0,0)합니다. 값을 설정하지 않으려면 0을 전달하십시오 (또는 기본값을 설정할 수 있음). 이 메서드는 새 날짜를 반환합니다 (Chrome 및 Firefox에서 테스트 됨).

function createDate(days, months, years) {
        var date = new Date();
        date.setDate(date.getDate() + days);
        date.setMonth(date.getMonth() + months);
        date.setFullYear(date.getFullYear() + years);
        return date;
    }


답변

MomentJS 라이브러리를 사용하는 것이 좋습니다. Dates와의 모든 상호 작용을 훨씬 간단하게 만듭니다.

Moment를 사용하는 경우 코드는 다음과 같이 간단합니다.

var today = moment();
var nextMonth = today.add('month', 1);
// note that both variables `today` and `nextMonth` refer to 
// the next month at this point, because `add` mutates in-place

MomentJS는 여기에서 찾을 수 있습니다 : http://momentjs.com/

최신 정보:

JavaScript에서 Date.getDate () 함수는 1-31에서 현재 날짜를 반환합니다. 이 숫자에서 6을 빼고 있으며 현재 해당 월의 3 일입니다. 이것은 값을 -3으로 가져옵니다.


답변

이것은 Phil의 대답을 기반으로 전달 된 시작 날짜를 취하는 순수 함수입니다.

function deltaDate(input, days, months, years) {
    return new Date(
      input.getFullYear() + years,
      input.getMonth() + months,
      Math.min(
        input.getDate() + days,
        new Date(input.getFullYear() + years, input.getMonth() + months + 1, 0).getDate()
      )
    );
}

예 : 한 달 전 날짜를 콘솔 로그에 기록합니다.

console.log(deltaDate(new Date(), 0, -1, 0));

예 : 2020 년 3 월 30 일에서 한 달을 뺍니다.

console.log(deltaDate(new Date(2020, 2, 30), 0, -1, 0)); // Feb 29, 2020

월말이나 연도 말을 지나도 작동합니다.

업데이트 : 위의 예에서 볼 수 있듯이 한 달의 일수 차이를 처리하도록 업데이트되었습니다.


답변

momentjs 메서드 subtract 와 유사한 기능을 구현했습니다 .

-Javascript를 사용하는 경우

function addDate(dt, amount, dateType) {
  switch (dateType) {
    case 'days':
      return dt.setDate(dt.getDate() + amount) && dt;
    case 'weeks':
      return dt.setDate(dt.getDate() + (7 * amount)) && dt;
    case 'months':
      return dt.setMonth(dt.getMonth() + amount) && dt;
    case 'years':
      return dt.setFullYear( dt.getFullYear() + amount) && dt;
  }
}

예:

let dt = new Date();
dt = addDate(dt, -1, 'months');// use -1 to subtract 

-Typescript를 사용하는 경우 :

export enum dateAmountType {
  DAYS,
  WEEKS,
  MONTHS,
  YEARS,
}

export function addDate(dt: Date, amount: number, dateType: dateAmountType): Date {
  switch (dateType) {
    case dateAmountType.DAYS:
      return dt.setDate(dt.getDate() + amount) && dt;
    case dateAmountType.WEEKS:
      return dt.setDate(dt.getDate() + (7 * amount)) && dt;
    case dateAmountType.MONTHS:
      return dt.setMonth(dt.getMonth() + amount) && dt;
    case dateAmountType.YEARS:
      return dt.setFullYear( dt.getFullYear() + amount) && dt;
  }
}

예:

let dt = new Date();
dt = addDate(dt, -1, 'months'); // use -1 to subtract

선택 사항 (단위 테스트)

또한 Jasmine을 사용하여이 기능에 대한 단위 테스트를 수행했습니다 .

  it('addDate() should works properly', () => {
    for (const test of [
      { amount: 1,  dateType: dateAmountType.DAYS,   expect: '2020-04-13'},
      { amount: -1, dateType: dateAmountType.DAYS,   expect: '2020-04-11'},
      { amount: 1,  dateType: dateAmountType.WEEKS,  expect: '2020-04-19'},
      { amount: -1, dateType: dateAmountType.WEEKS,  expect: '2020-04-05'},
      { amount: 1,  dateType: dateAmountType.MONTHS, expect: '2020-05-12'},
      { amount: -1, dateType: dateAmountType.MONTHS, expect: '2020-03-12'},
      { amount: 1,  dateType: dateAmountType.YEARS,  expect: '2021-04-12'},
      { amount: -1, dateType: dateAmountType.YEARS,  expect: '2019-04-12'},
    ]) {
      expect(formatDate(addDate(new Date('2020-04-12'), test.amount, test.dateType))).toBe(test.expect);
    }

  });

이 테스트를 사용하려면 다음 기능이 필요합니다.

// get format date as 'YYYY-MM-DD'
export function formatDate(date: Date): string {
  const d     = new Date(date);
  let month   = '' + (d.getMonth() + 1);
  let day     = '' + d.getDate();
  const year  = d.getFullYear();

  if (month.length < 2)  {
    month = '0' + month;
  }
  if (day.length < 2) {
    day = '0' + day;
  }

  return [year, month, day].join('-');
}


답변

시간 및 날짜 관리를 위해 moment.js 라이브러리를 사용하십시오 .

import moment = require('moment');

const now = moment();

now.subtract(7, 'seconds'); // 7 seconds ago
now.subtract(7, 'days');    // 7 days and 7 seconds ago
now.subtract(7, 'months');  // 7 months, 7 days and 7 seconds ago
now.subtract(7, 'years');   // 7 years, 7 months, 7 days and 7 seconds ago
// because `now` has been mutated, it no longer represents the current time


답변

이것은 질문에 완전히 대답하지 않지만 초기 날짜를 상쇄하려는 일 수를 계산할 수있는 사람에게는 다음 방법이 작동합니다.

myDate.setUTCDate(myDate.getUTCDate() + offsetDays);

offsetDays는 양수 또는 음수 일 수 있으며 주어진 오프셋이있는 지정된 초기 날짜에 대해 결과가 정확합니다.