从JavaScript中的日期减去天,月,年

时间:2016-05-03 11:18:49

标签: javascript

有没有人知道采取约会的简单方法(例如今天)并回溯X天,X个月和X年?

我试过了:

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

但我得到了一个否定日期,例如今天的输出是:

  

3/3/2015

有任何建议吗?

感谢。

9 个答案:

答案 0 :(得分:54)

您只是从数字中减少值。因此从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()));

答案 1 :(得分:16)

正如其他人所说,您要从date.getDate()等方法返回的数值中减去,您需要在日期变量上重置这些值。我已经创建了一个方法,可以为您完成此操作。它使用new Date()创建一个日期,该日期将使用当前日期初始化,然后根据传入的值设置日期,月份和年份。例如,如果您想要返回6天,则传入-6像这样var newdate = createDate(-6,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;    
    }

答案 2 :(得分:13)

我建议使用MomentJS库。它们使与日期的所有互动变得更加简单。

如果您使用Moment,您的代码将如此简单:

var today = moment();
var nextMonth = today.add('month', 1);

您可以在此处找到MomentJS:http://momentjs.com/

<强>更新

在JavaScript中,Date.getDate()函数从1-31返回当月的当前日期。你从这个数字减去6,它目前是这个月的第3个。这会使值为-3。

答案 3 :(得分:3)

这是一个纯函数,需要一个传入的开始日期,以Phil的答案为基础:

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

例如将一个月前的日期写入控制台日志:

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

请注意,即使您超过月份或年份的月底,此方法也仍然有效。

答案 4 :(得分:3)

我实现了类似于 momentjs 方法的功能。

-如果您使用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 

-如果使用打字稿:

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

可选(单元测试)

我还使用茉莉花对该功能进行了一些单元测试:

  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('-');
}

答案 5 :(得分:1)

使用moment.js库进行时间和日期管理。

import moment = require('moment');

const now = moment();

now.subtract('seconds', 7); // takes 7 seconds of the current time
now.subtract('days', 7);    // takes 7 days of the current date
now.subtract('months', 7);  // takes 7 months of the current date
now.subtract('years', 7);   // takes 7 years of the current date

答案 6 :(得分:0)

这不能完全回答问题,但是对于任何能够计算他们希望抵消初始日期的天数的人,以下方法将起作用:

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

offsetDays可以是正数或负数,并且对于任何给定的初始日期和任何给定的偏移量,结果都是正确的。

答案 7 :(得分:0)

我有一个简单的答案,它可以完美地工作几天;几个月,这是+ -2天:

let today=new Date();
const days_to_subtract=30;
let new_date= new Date(today.valueOf()-(days_to_subtract*24*60*60*1000));

您明白了-连续几个月乘以30;但这将是+ -2天。

答案 8 :(得分:0)

例如获取昨天日期的oneliner将是:

const yesterday = ((date) => date.setDate(date.getDate() - 1) && date)(new Date());

它将定义一个接收 new Date() 作为参数(日期)的箭头函数。制作箭头函数的原因是新的 Date 对象会被多次使用。首先检索当前天数 (getDate),然后设置天数 (setDate) 并将其作为结果返回。所以它将返回变异的日期,而不是原始日期。

现在这个箭头函数被定义了,将立即用 new Date() 调用以返回昨天的日期。