如何添加到目前为止的月份?淘汰赛

时间:2014-06-25 13:52:32

标签: javascript knockout.js

我正在进行一些计算我得到的不是几个月,所以我需要添加到startdate并在添加月份时动态显示结束日期。

到目前为止我的努力:

查看型号:

function calculation() {
var self = this;
self.months= ko.observable("");
self.StartDate = ko.observable("");  // On my get i get startdate like **2014-06-24**
         self.EndDate = ko.computed(function () {
            return  self.StartDate() + ?? // i have no clue how to add 
        });

我的cshtml代码:

  <input type="text" data-bind="value:$data.StartDate" />
  <input type="text" data-bind="value:$data.EndDate" />

编辑: 令人厌恶的建议我试过这样但格式化并不是令人遗憾的标记

 self.EndDate = ko.computed(function () {
            var date = new Date(self.StartDate());
            date.setMonth(date.getMonth() + 8); // tried static 

            return date.toLocaleDateString() ;

        });

我得到像 2015年2月24日之类的东西,但我希望 2015-02-24 ,因为我以同样的格式通过了日期

感谢任何建议

4 个答案:

答案 0 :(得分:1)

您必须考虑日期附带的各种边缘情况。例如,10月31日+ 1个月显然不是11月31日。然后你必须考虑到2月份的天数取决于它是否是闰年。

在这个问题中看看Jazaret的答案,以确定从现在起x个月内的确切日期:

How to add months to a date in JavaScript?

然后您可以将其添加到您的代码中:

self.EndDate = ko.computed(function () {
    var date = new Date(self.StartDate());
    return  date.addMonths(5); // add however months you want
});

答案 1 :(得分:1)

添加月份(比如将一个月添加到1月31日)可能会溢出天数字段并导致月份增加(在这种情况下,您将在3月份获得日期)。如果你想添加几个月然后溢出日期,那么.setMonth(base_date.getMonth()+ monthsToAdd)可以工作,但很少人们在谈论增加月数时会想到的。

我用这个来增加几个月的日期,我不想在这个月溢出:

function addMonthsNoOverflow(dateParam, intParam) {
    var sum = new Date(new Date(dateParam.getTime()).setMonth(dateParam.getMonth() + intParam);
    if (sum.getDate() < dateParam.getDate()) {  sum.setDate(0);  }
    return(sum);
}

注意: 它通过消除溢出来处理29,30或31转为1,2或3的情况 日期不是零索引,因此.setDate(0)是上个月的最后一天。

http://jsfiddle.net/zjdj3zxz/1/

答案 2 :(得分:0)

以下是将月份添加到日期的相当基本的示例:

JSFiddle

小提琴代码:

var ViewModel = function () {
    var self = this;

    self.StartDate = ko.observable(new Date("2014-06-24"));
    self.EndDate = ko.computed(function () {
        var myDate = new Date(self.StartDate());
        myDate.setMonth(myDate.getMonth() + 5)
        return myDate;
    });
};

$(function () {
    var vm = new ViewModel();
    ko.applyBindings(vm);
});

正如@AndrewC在其帖子中指出的那样,这并不包括边缘案例,您必须在其中记录不同天数的月份,并根据您的要求处理它们。

答案 3 :(得分:0)

编辑:请在项目中包含Moment.js库。这样日期计算和格式化将非常容易。只需看看the examples in the docs

所以,我相信这就是你想要的:

http://jsfiddle.net/

var ViewModel = function(date, noOfMonths) {
    this.calculation = ko.computed(function(){
    var m = moment(date);
    return m.add('months',noOfMonths).format('YYYY-MM-DD');
    },this);
};

ko.applyBindings(new ViewModel(new Date('7/31/2014 17:15:00'), 4));