Javascript 从 Date 对象中减去天/月/年

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4121796/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 11:00:25  来源:igfitidea点击:

Subtracting days/months/years from a Date object

javascriptdatetimemath

提问by dave

var inputDate     = '20/4/2010'.split('/');
var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0]));

var expiryDate = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year);

This is the Javascript code I'm using to work out an expiry date given a user inputted date. Currently, the expiry date is original date minus one day and original year minus X.

这是我用来计算给定用户输入日期的到期日期的 Javascript 代码。目前,到期日是original date minus one day and original year minus X

The problems with this code, firstly, it doesn't take into account invalid dates. For example, if the user supplied date is '1/10/2010', the expiry date will be '0/10/2013' (assuming the expiry date is +3 years).

这段代码的问题,首先是它没有考虑无效日期。例如,如果用户提供的日期为“1/10/2010”,则到期日期将为“0/10/2013”​​(假设到期日期为 +3 年)。

I could do something like:

我可以做这样的事情:

var inputDate = '20/4/2010'.split('/');
var day       = parseInt(inputDate[0]);
var month     = parseInt(inputDate[1]);
var year      = parseInt(inputDate[2]);

if (day < 1)
{
    if (month == ...)
    {
        day   = 31
        month = month - 1;
    }
    else
    {
        day   = 30
        month = month - 1;
    }
}

var dateFormatted = new Date(parseInt(inputDate[2]), parseInt(inputDate[1]), parseInt(inputDate[0]));
var expiryDate    = (dateFormatted.getDate() - 1) + '/' + dateFormatted.getMonth() + '/' + (dateFormatted.getFullYear() + year);

But more problems arise... Firstly, the code gets a little convoluted. Secondly, this check would have to be done on the day. and then the month. Is there a cleaner, simpler way?

但更多的问题出现了......首先,代码变得有点复杂。其次,这项检查必须在当天进行。然后是月份。有没有更干净、更简单的方法?

Also, there's a certain circumstance that would involve me needing to calculate the expiry date to the 'end of the month' for that date. For example:

此外,在某些情况下,我需要将到期日期计算为该日期的“月底”。例如:

Expiry date is: +3 years

User date is: '14/10/2010'
Expiry date is: '31/10/2013'

I was hoping the Date objectwould support these calculations but according to https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date, it seems not...

我希望Date object能支持这些计算,但根据https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date,它似乎不是......

回答by Noah

Easy way to see if a date inputed is a valid date:

查看输入的日期是否为有效日期的简单方法:

var d = Date.parse('4/20/2010');
if (isNaN(d.valueOf())) {
 alert ("bad date value"); 
}

Then, here is a dateAdd function that I use regularly. Extends the Date object, so it's easy to use:

然后,这是我经常使用的 dateAdd 函数。扩展了 Date 对象,所以它很容易使用:

Date.prototype.dateAdd = function(size,value) {
    value = parseInt(value);
    var incr = 0;
    switch (size) {
        case 'day':
            incr = value * 24;
            this.dateAdd('hour',incr);
            break;
        case 'hour':
            incr = value * 60;
            this.dateAdd('minute',incr);
            break;
        case 'week':
            incr = value * 7;
            this.dateAdd('day',incr);
            break;
        case 'minute':
            incr = value * 60;
            this.dateAdd('second',incr);
            break;
        case 'second':
            incr = value * 1000;
            this.dateAdd('millisecond',incr);
            break;
        case 'month':
            value = value + this.getUTCMonth();
            if (value/12>0) {
                this.dateAdd('year',value/12);
                value = value % 12;
            }
            this.setUTCMonth(value);
            break;
        case 'millisecond':
            this.setTime(this.getTime() + value);
            break;
        case 'year':
            this.setFullYear(this.getUTCFullYear()+value);
            break;
        default:
            throw new Error('Invalid date increment passed');
            break;
    }
}

Then just use:

然后只需使用:

 var d = new Date();
 d.dateAdd('day', -1).dateAdd('year', 3);

T'da

达达

回答by Gunjit

A similar question has been answered here:

这里已经回答了一个类似的问题:

How to add/subtract dates with javascript?

如何使用 javascript 添加/减去日期?

Similar thing can be done for months and years.

类似的事情可以持续数月甚至数年。

For e.g.

例如

     var date = new Date('2011','01','02');
     alert('the original date is '+date);
     var newdate = new Date(date);
     newdate.setMonth(newdate.getMonth() - 7);
     var nd = new Date(newdate);
     alert('the new date is '+nd);

回答by DoXicK

var currentDate = new Date(year,month,day);
var expiryDate = new Date();
expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000));

using the number of seconds past 1970 is fine for this :-) oh, you have more rules. well after that you will still have to check for those cases...

使用 1970 年以后的秒数很好:-) 哦,你有更多的规则。在那之后,您仍然需要检查这些情况......

回答by Dr.Molle