有没有人知道采取约会的简单方法(例如今天)并回溯X天,X个月和X年?
我试过了:
var date = new Date();
$("#searchDateFrom").val((date.getMonth() -1 ) + '/' + (date.getDate() - 6) + '/' + (date.getFullYear() - 1));
但我得到了一个否定日期,例如今天的输出是:
3/3/2015
有任何建议吗?
感谢。
答案 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 方法减的功能。
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()
调用以返回昨天的日期。