我正在进行一些计算我得到的不是几个月,所以我需要添加到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 ,因为我以同样的格式通过了日期
感谢任何建议
答案 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)是上个月的最后一天。
答案 2 :(得分:0)
以下是将月份添加到日期的相当基本的示例:
小提琴代码:
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。
所以,我相信这就是你想要的:
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));