用JavaScript从特定日期减去X天来查找日期

47
我想在JavaScript中通过减去X天数,从指定日期中找到一个日期。我的JavaScript函数有两个参数。一个是日期值,另一个是需要减去的天数。
例如,如果我将27 July 2009作为第一个参数传递,并将另一个参数设置为3,则我想计算出在27 July 2009之前3天的日期。因此,我们应该得到的结果日期是2009年7月24日。在JavaScript中如何实现这一点?感谢您的帮助。
9个回答

81

简单来说:

yourDate.setDate(yourDate.getDate() - daysToSubtract);

3
除非当月的日期大于你要减去的天数,否则我认为这不会起作用。 - tvanfosson
2
例如,今天是27号(在美国),所以它可以使用-3。但如果今天是2号,你会得到新日期为-1,如果你试图将月份的日期设置为负数,setDate函数将无法运行。 - tvanfosson
13
@all:这将适用于所有情况。如果setDate得到一个负值,那么它会像你希望的那样将日期设置回上个月。这比以毫秒为单位减去天数容易得多。 - Prestaul
1
这种方法并非在所有情况下都适用。请参考Ash Wednesday的例子:https://dev59.com/QF_Va4cB1Zd3GeqPWsR8 - ron tornambe
1
如果范围跨越夏令时,这将无法正常工作。 - Emmanuel
显示剩余4条评论

23
function date_by_subtracting_days(date, days) {
    return new Date(
        date.getFullYear(), 
        date.getMonth(), 
        date.getDate() - days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}

1
这个方法可行,我认为这是最好的答案。其他方法如果我在一个月的31日加上7天,都会返回38。谢谢! - Grandizer
这种方法对我来说更可靠-它返回一个“日期”对象,而接受的答案则给了我一个“Int”。 - brichins
如果你在一个月的第一天,然后减去一些天数导致结果为负数,那么会发生什么?Date类能够处理这种情况吗? - Atticus
这对我也起作用了,而被接受的答案失败了。 - Jamie Bull
我本来想给这个答案点赞的,但是我有一个严格的个人原则,从不点赞仅包含代码的答案——因为它们会模仿糟糕的回答发布方式。当新用户看到高声望用户的仅包含代码的答案可以获得“独角兽”点数时,他们认为这样做是可以的。如果这个答案被改进了,请通知我,我会点赞的。 - mickmackusa

9

不要采用以下解决方案:yourDate.setDate(yourDate.getDate() - daysToSubtract);,因为当你的日期是某月的第一天且你想删除一些天数(例如1天)时,它不起作用。

相反,请选择以下解决方案,它始终有效:

var newDate = new Date( yourDate.getTime() - (days * 24 * 60 * 60 * 1000) );


这是我迄今为止找到的最好、最简单的解决方案,它处理了所有边界情况,而其他人似乎都忽略了。谢谢! - tokyo0709
1
大多数日期都有时区,而这种解决方案可能会在一些跨越夏令时的值上失败。这是一个常见的错误,因为简单的测试无法显示问题,例如读取输入类型为日期可能会导致问题,因为它意外地具有时区和时间。在毫秒级别上操作时间值真的很困难,很容易出现奇怪的错误。 - robocat

2

我在这里发布另一个答案,它将以特定格式返回日期。

首先,您可以按如下方式获取当前日期10/08/2013

function Cureent_Date() {
    var today_GMT = new Date();
    var dd = today_GMT.getDate();
    var mm = today_GMT.getMonth() + 1; //January is 0!
    var yyyy = today_GMT.getFullYear();
    if (dd < 10) {
        dd = '0' + dd
    }
    if (mm < 10) {
        mm = '0' + mm
    }
    current_date = mm + '/' + dd + '/' + yyyy;
    alert("current_date"+current_date);

    Back_date();
}

现在根据X天获取返回日期

function Back_date()
{    
    var back_GTM = new Date(); back_GTM.setDate(back_GTM.getDate() - 2); // 2 is your X
    var b_dd = back_GTM.getDate();
    var b_mm = back_GTM.getMonth()+1;
    var b_yyyy = back_GTM.getFullYear();
    if (b_dd < 10) {
        b_dd = '0' + b_dd
    }
    if (b_mm < 10) {
        b_mm = '0' +b_mm
    }

    var back_date=  b_mm + '/' + b_dd + '/' + b_yyyy;
    alert("back_date"+back_date);
}

所以,今天是10/08/2013,所以它将返回10/06/2013在此处检查实时演示,希望这个答案能帮到你。

1
这里有一个例子,但是它没有进行任何检查(例如,如果你在2009/7/1使用它,它会使用负数天数或抛出错误)。
function subDate(o, days) {
// keep in mind, months in javascript are 0-11
return new Date(o.getFullYear(), o.getMonth(), o.getDate() - days);;
}

那似乎也可以(至少在Safari中)。我很惊讶被接受的答案是有效的。显然,它会调整月份/年份以返回有效日期:例如,Date(2009,6,0)变成了Date(2009,5,30)。 - Patrick McElhaney
对我来说,在Firefox和Safari中都可以工作,包括负数。 - tvanfosson

0

这是我会做的。请注意,您可以简化表达式,我只是将其写出来以明确您正在乘以每天毫秒数的天数。

 var newDate = new Date( yourDate.getTime() - (days * 24 * 60 * 60 * 1000) );

2
不要这样做,使用天数代替。这可能会在观察夏令时的地方导致错误。例如,对于我来说,“Mar 14 2011”减去12460601000等于“Mar 12 2011”。 - Wiseguy
确认。当夏令时开始时,这种方法错误地或至少出乎意料地减去了一个小时。 - Seth

0

另一个选项,我写了:

DP_DateExtensions Library

如果你只想进行一次计算,这可能有点过度,但如果你要进行更多的日期操作,你可能会发现它很有用。

支持日期/时间格式化、日期数学(添加/减去日期部分)、日期比较、日期解析等。


似乎对我有效...日志中没有我能看到的任何东西 - 你还在遇到这个问题吗?出现了什么错误?谢谢。 - Jim Davis

0
我已经创建了一个日期操作函数。您可以添加或减去任意数量的天数、小时和分钟。
function dateManipulation(date, days, hrs, mins, operator) {
    date = new Date(date);
    if (operator == "-") {
       var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
       var newDate = new Date(date.getTime() - durationInMs);
    } else {
       var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
       var newDate = new Date(date.getTime() + durationInMs);
    }
   return newDate;
}

现在,通过传递参数来调用此函数。例如,以下是一个获取今天之前3天日期的函数调用。

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");

0
这是关于上面回答的引用。 请查看此fiddle。

https://jsfiddle.net/uniyalguru/azh65aa0/

function Cureent_Date() {
var today_GMT = new Date();
var dd = today_GMT.getDate();
var mm = today_GMT.getMonth() + 1; //January is 0!
var yyyy = today_GMT.getFullYear();
if (dd < 10) {
    dd = '0' + dd
}
if (mm < 10) {
    mm = '0' + mm
}
current_date = mm + '/' + dd + '/' + yyyy;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接