2017-07-03 58 views
0

我正在建立一个使用JavaScript(Vue JS)的日历。我有这个小方法来帮助获得当月的日子:JS日历短两天

daysInYearMonth(y,m){ 
    return new Date(y, m, 0).getDate() 
} 

如果我console.log上面我得到31,因为它是七月。但是,当它使用这个值时:

this.days = [...Array(this.daysInYearMonth(this.year, 
    this.month)).keys()] 
} 

我console.log this.days并得到29天,两个短。如果我只是尝试添加两个,那么其他几个月就关闭了。这是我的CodePen

注意:我故意不使用Moment.js,尽管我同意它更好,但团队决定只使用Vue和vanilla JS。

+0

在此处发布您的代码,而不仅仅是在远程站点。您可以使用[Stack Snippets](https://stackoverflow.blog/2014/09/introducing-runnable-javascript-css-and-html-code-snippets/)使其可执行。 – Barmar

+0

@Barmar我相信这是所有相关的代码。但是我确实看到了让代码在问题中可执行的价值,所以如果链接变坏,它仍然有价值。我会创建一个片段,我不知道这个功能,谢谢! – Auzy

+1

'new Date()。getMonth()'今天是6.并且Array(x)将基于零。 – Bert

回答

0

daysInYearMonth()返回的是您要求的月份之前的天数。在日期中使用日期0时,表示该日期前一个月的最后一天。这就是为什么你得到7月30,而不是31。因此,要获得当月的最后一天,您需要使用下个月。

daysInYearMonth(y,m){ 
    return new Date(y, m+1, 0).getDate() 
} 

接下来的问题是,数组的键在0开始,但在几个月天1开始。所以当你做Array(this.daysInYearMonth(this.year, this.month)).keys()它返回一个从030而不是131的数组。解决这个问题的最简单方法是编写一个从1开始的循环,而不是用数组玩游戏。

let lastday = this.daysInYearMonth(this.year, this.month); 
this.days = []; 
for (let d = 1; d <= lastday; d++) { 
    this.days.push(d); 
}