【问题标题】:Subtracting days/months/years from a Date object从 Date 对象中减去天/月/年
【发布时间】:2010-11-08 06:47:10
【问题描述】:
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);

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

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

我可以这样做:

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);

但是出现了更多问题……首先,代码有点复杂。其次,这项检查必须在当天完成。然后是月份。有没有更清洁、更简单的方法?

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

Expiry date is: +3 years

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

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

【问题讨论】:

  • momentjs.com 让这种方式变得更容易:momentjs.com

标签: javascript datetime math


【解决方案1】:

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

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

然后,这是我经常使用的 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;
    }
}

然后只需使用:

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

太棒了

【讨论】:

  • 我认为这个答案是最好的解决方案,您在示例中解析的日期有点锦上添花。谢谢!
  • 只是一个旁注,验证是好的,但是不要用解析的变量 d 调用原型。您显然需要将其实例化为 Date 对象。否则你会得到愚蠢的错误,“dateAdd,不存在”。 var d = 日期(); d.dateAdd('day', -1).dateAdd('year', 3);
  • 我认为这不是正确的解决方案。根据出生日期,我希望人应该是 18 岁以上。尝试从当前日期(2014 年 3 月 28 日)减去 18 年,此解决方案返回 1996 年 2 月 28 日。我交叉验证了来自 timeanddate.com/date/…calculator.net/… 的答案我得到的日期是 28-March-1996 所以我认为缺少一些东西。
  • JavaScript 日期对象中的月份是零索引的,因此第 2 个月是三月。一月=0,二月=1,三月=2,等等……
  • 这怎么还没有达到 100 票呢。对于那些不想一直依赖插件并想要更手动的方法来获得简单解决方案的人来说,这是一个绝妙的答案!
【解决方案2】:

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

How to add/subtract dates with javascript?

类似的事情可以做几个月甚至几年。

例如

     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);

【讨论】:

    【解决方案3】:
    var currentDate = new Date(year,month,day);
    var expiryDate = new Date();
    expiryDate.setTime(currentDate.getTime() + (3 * 365 * 24 * 60 * 60 * 1000));
    

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

    【讨论】:

    • 抱歉,我不完全确定它是如何工作的……每个数字代表什么?我将如何使用它计算给定日期之上的 +4 年?
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多