2017-07-20 51 views
0

这里的问题:我有一个Kendo.DatePicker,作为一个过滤器,它的默认值设置为这个,在控制上个月获取的DatePicker

.Value(DateTime.Now.AddMonths(-1)) 

当我们点击了“清除过滤器“按钮,我希望日期返回到默认值,该值始终为CurrentDate - 1个月

我都这样了,来获取当前日期(从this question得到它)

var todayDate = kendo.toString(kendo.parseDate(new Date()), 'dd/MM/yyyy'); 
$("#initialDate").data("kendoDatePicker").value(todayDate); 

所以,我怎么之前得到蛾呢?我试图玩getMonthsetMonth,但无法使它工作。

+0

你基本上必须在JavaScript中获得你想要的日期,请参阅:https://stackoverflow.com/questions/26488043/javascript-get-previous-months-date –

+0

@DanDumitru我看到了类似的答案,但我想我错过了那里有一点。之前没有正确使用getMonth,现在它工作正常:)谢谢。 –

回答

1

C#的AddMonths改变DateTime的月份与JavaScript的setMonth大致相同。然而,重要的是,AddMonths考虑了边缘情况,例如需要一年前进/后退,或者特定日期在该月无效时发生的情况。例如,如果您从2017年3月29日减去一个月,那么当年没有2月29日。因此,日期组件需要更改为28.如果这是一个闰年,将会有,但也必须考虑到这一点。

JavaScript的setMonth比较笨拙。它实际上只是修改月份,然后根据需要让日期溢出。例如,在前一个从2017年3月29日减去一个月的情况下,2017年3月1日的JavaScript实际上会在2月1日发布,然后添加29天的日期组件。自2月份以来,只有28个,它回到了3月份。它至少足够聪明地考虑闰年,所以在2016年等一年中,实际上最终会在2月29日结束。

无论如何,JavaScript的日期非常糟糕。如果你真的想与他们合作,我建议使用像Moment.js这样的库,其中巧妙地处理这些类型的情况。

但是,您最好的解决方案可能是简单地保留C#中的默认值,这样您就不必担心后来必须通过JavaScript来计算它。例如,您可以添加一个data-*属性,如:

.HtmlAttributes(new { data_default = DateTime.Now.AddMonths(-1) }) 

然后,你可以简单地从输入读取这个值,当它清除设置控制了这一点。

+0

2月号与我的情况并不相关,因为它到了3月1日才适合它的意图。我选择了@DanDumitru链接的解决方案,因为我希望在某个函数中计算日期,以便在每次有人想清除过滤器时使用该日期,并将其全部清除。 –