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

use*_*165 50 javascript

有没有人知道一个简单的约会方式(例如今天)和回去X天,X个月和X年?

我试过了:

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

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

3/3/2015

有什么建议吗?

谢谢.

gur*_*372 74

您只是从数字中减少值.因此从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()));
Run Code Online (Sandbox Code Playgroud)

  • getMonth()基于零.这意味着它将显示错误的月份.示例:10是11月. (8认同)
  • 我们只是说: getMonth() 是基于索引的。 (4认同)

Phi*_*hil 19

正如其他人所说,你要从类似方法返回的数值中减去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;    
    }
Run Code Online (Sandbox Code Playgroud)


FvB*_*FvB 14

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

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

var today = moment();
var nextMonth = today.add('month', 1);
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到MomentJS:http://momentjs.com/

更新:

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

  • 当前版本的 moment(在撰写本文时为 2.18.2)对此功能发出警告。add/subtract('period', number) 已弃用,建议您使用 add/subtract(number, 'period') 代替。 (3认同)

Ste*_*rzì 6

我实现了一个类似于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;
  }
}
Run Code Online (Sandbox Code Playgroud)

例子:

let dt = new Date();
dt = addDate(dt, -1, 'months');// use -1 to subtract 
Run Code Online (Sandbox Code Playgroud)

- 如果您使用打字稿:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

例子:

let dt = new Date();
dt = addDate(dt, -1, 'months'); // use -1 to subtract
Run Code Online (Sandbox Code Playgroud)

可选(单元测试)

我还使用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);
    }

  });
Run Code Online (Sandbox Code Playgroud)

要使用此测试,您需要此功能:

// 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('-');
}
Run Code Online (Sandbox Code Playgroud)


N8a*_*lan 5

这是一个纯函数,需要一个传递的开始日期,以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;
}
Run Code Online (Sandbox Code Playgroud)

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

console.log(deltaDate(new Date(), 0, -1, 0));
Run Code Online (Sandbox Code Playgroud)

请注意,即使您在月底或年份结束时也可以使用。

  • 但几个月后它将有奇怪的行为。3月29日-1个月= 2月29日,将导致3月1日。3月31日+ 1个月= 4月31日,将导致5月1日。根据您的用例,可能不是您所期望的。 (2认同)
  • 谢谢@Johanneke,我已经更新了代码来解决这个问题。 (2认同)
  • 当天的更正使这个答案非常有用,谢谢! (2认同)

小智 5

使用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
Run Code Online (Sandbox Code Playgroud)