![](/img/trans.png)
[英]Get Date of days of a week given year, month and week number (relative to month) in Javascript / Typescript
[英]Get week range for given month and year in JavaScript
我需要在所选月份的相应周显示一系列日期。 假设选定的值为month=3
(April) 和year=2018
。 output 应显示所选特定月份中几周的范围日期列表。
month = 3;
year = 2018;
Output:
第 1 周:01/04/2018 - 01/04/2018
第 2 周:02/04/2018 - 08/04/2018
第 3 周:09/04/2018 - 15/04/2018
第 4 周:16/04/2018 - 22/04/2018
第 5 周:23/04/2018 - 29/04/2018
第 6 周:30/04/2018 - 30/04/2018
我试过这个 function 但它不能正常工作。 你能帮助我吗? 多谢。
public getWeeksInMonth(): {
let year: number = 2018;
let month: number = 3 //April;
const weeks = [];
const firstDay: Date = new Date(year, month, 1);
const lastDay: Date = new Date(year, month + 1, 0);
const daysInMonth: number = lastDay.getDate();
let dayOfWeek: number = firstDay.getDay();
let start: number;
let end: number;
for (let i = 1; i < daysInMonth + 1; i++) {
if (dayOfWeek === 0 || i === 1) {
start = i;
}
if (dayOfWeek === 6 || i === daysInMonth) {
end = i;
if ((start !== end) || (start === 30 && end === 30) || (start === 31 && end === 31)) {
weeks.push({
'start': start,
'end': end
});
}
}
dayOfWeek = new Date(year, month, i).getDay();
}
return weeks;
}
第一个问题是星期日通过.getDay()
而不是星期一得到0
。
解决了检查
dayOfWeek === 1
而不是dayOfWeek === 0
和dayOfWeek === 0
而不是dayOfWeek === 6
的问题。
第二个问题是你在推新week
之前的检查。 您正在检查 if start !== end
但start
可能等于end
通过在推送新的一周并检查
start
后将start
设置为 null 解决了这个问题。
(下面的例子是用 JS 写的,因为 TS 在 StackOverflow 上是无法运行的)
function getWeeksInMonth() { let year = 2018; let month = 3; //April; const weeks = []; const firstDay = new Date(year, month, 1); const lastDay = new Date(year, month + 1, 0); const daysInMonth = lastDay.getDate(); let dayOfWeek = firstDay.getDay(); let start; let oldstart; let end; for (let i = 1; i < daysInMonth + 1; i++) { if (dayOfWeek === 1 || i === 1) { start = i; } if (dayOfWeek === 0 || i === daysInMonth) { end = i; if(start){ weeks.push({ 'start': start, 'end': end }); start = null; } } dayOfWeek = new Date(year, month, i + 1).getDay(); } return weeks; } console.log(getWeeksInMonth());
我稍微重构了您的解决方案,它似乎提供了预期的结果。
我的代码与您的代码完全相同(蛮力)方法:
Array.from()
),并用该月每一天的日期填充它;Array.prototype.reduce()
)并放入对应于周的结果数组对象( {week,start,end}
),在您到达星期一时生成新对象,并在您到达星期日时关闭结束日期: const getWeeksInMonth = (month, year) => Array.from({length: (new Date(year, month+1, 0) - new Date(year, month, 0))/864E5}, (_,i) => new Date(year, month, i+1)).reduce((res,date,idx,self) => { const itsMonday = date.getDay() == 1, itsSunday = date.getDay() == 0, monthStart = idx == 0, monthEnd = idx == self.length-1, options = {dateStyle: 'short'}; if(itsMonday || monthStart) res.push({ week:(res[res.length-1]||{week:0}).week+1, start: date.toLocaleDateString('fr',options), end: (monthStart? date.toLocaleDateString('fr',options): '') }); if(itsSunday || monthEnd) res[res.length-1].end = date.toLocaleDateString('fr',options); return res; }, []); console.log(getWeeksInMonth(3,2018));
.as-console-wrapper {min-height:100%}
我找到了解决方案。 这里完整的功能正常工作:
public getWeeksInMonth(): Observable<Week[]> {
let year: number = 2018;
let month: number = 3;
const weeks: Week[] = [];
const firstDay: Date = new Date(Date.UTC(year, month, 1));
const lastDay: Date = new Date(Date.UTC(year, month + 1, 0));
const daysInMonth: number = lastDay.getDate();
let dayOfWeek: number = firstDay.getDay();
let start: number;
let end: number;
for (let i = 1; i < daysInMonth + 1; i++) {
if (dayOfWeek === 0 || i === 1) {
start = i;
}
if (dayOfWeek === 0 && start === 1 && i !== daysInMonth) {
end = 1;
weeks.push({
'start': start,
'end': end
});
}
if (dayOfWeek === 6 || i === daysInMonth) {
end = i;
if ((start !== end) || (start === 30 && end === 30) || (start === 31 && end === 31)) {
weeks.push({
'start': start,
'end': end
});
}
}
dayOfWeek = new Date(year, month, i).getDay();
}
return of(weeks);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.