在JavaScript中减去日期的天数


Answers

var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

如果您在整个Web应用程序中执行大量令人头疼的日期操作, DateJS将让您的生活更轻松:

http://simonwillison.net/2007/Dec/3/datejs/

Question

有人知道一个简单的方法来取日期(例如今天)并返回X天吗?

因此,例如,如果我想在今天5天前计算日期。




var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 100);

document.write('<br>100 days ago was: ' + d.toLocaleString());




var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;



我注意到,getDays + X在日/月边界不起作用。 只要您的日期不在1970年之前,使用getTime就可以工作。

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));



我喜欢在毫秒内做数学。 所以使用Date.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

如果你喜欢它的格式

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

注意: Date.now()在旧浏览器中不起作用(例如,我认为IE8)。 在这里填充

2015年6月更新

@socketpair指出我的sl。。 正如他/她所说:“每天有23个小时,有25个是由于时区规则。”

为了扩大这个范围,上面的答案在你想计算5天前在一个日光照明变化的时区的LOCAL日的情况下会有日照不准确的情况,而你

  • 假设(错误地) Date.now()给你当前LOCAL现在的时间,或者
  • 使用.toString()返回本地日期,因此与UTC中的Date.now()基准日期不兼容。

然而,如果你用UTC来计算你的数学,那么它就可以工作,例如

答:您希望从NOW(UTC)前5天前发出UTC日期

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B.您使用Date.UTC()之外的UTC基准日期开始,而不是“now”

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString



对于我来说,所有的组合都可以在下面的代码snipplet中正常工作,这个片段是用于Angular-2实现的,如果你需要添加日子,传递正数的日子,如果你需要减去传递负数的日子

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}



我将其转换为毫秒并扣除天数,其他月份和年份不会改变且符合逻辑

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

希望有帮助




var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());




最重要的答案导致了我的代码中的一个错误,在本月的第一个月它将设置当前月份的未来日期。 这是我所做的,

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time



设置日期时,日期转换为毫秒,因此您需要将其转换回日期:

这种方法也考虑到了,新的一年等等。

function addDays( date, days ) {
    var dateInMs = date.setDate(date.getDate() - days);
    return new Date(dateInMs);
}

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );



将日期分成几部分,然后用调整后的值返回一个新日期

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

请记住,这些月份基于零,但时间不是。 即新日期(2009,1,1)== 2009年2月01日,新日期(2009,1,0)== 2009年1月31日;




我发现getDate()/ setDate()方法存在一个问题,它很容易将所有内容都变成毫秒,而且语法有时难以遵循。

相反,我喜欢解决1天= 86,400,000毫秒的事实。

所以,针对你的特定问题:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

奇迹般有效。

我一直使用这种方法来进行30/60/365天的计算。

您可以轻松地推断出这一点,以创建数月,数年等时间单位。






Related