我已經給出了一個日期范圍作為輸入,即一個開始日期和一個結束日期,我需要構造一個包含周號和周開始日期以及周結束日期作為輸出的陣列。
輸入:
startDate = "2022-10-21"
endDate = "2022-12-05"
輸出:
result = [{
weekNo: "Oct 2022 - Week 4",
weekStartDate: "2022-10-21",
weekEndDate: "2022-10-23"
},
{
weekNo: "Oct 2022 - Week 5",
weekStartDate: "2022-10-24",
weekEndDate: "2022-10-30"
},
{
weekNo: "Oct 2022 - Week 6",
weekStartDate: "2022-10-31",
weekEndDate: "2022-10-31"
},
{
weekNo: "Nov 2022 - Week 1",
weekStartDate: "2022-11-01",
weekEndDate: "2022-11-06"
},
{
weekNo: "Nov 2022 - Week 2",
weekStartDate: "2022-11-07",
weekEndDate: "2022-11-13"
},
{
weekNo: "Nov 2022 - Week 3",
weekStartDate: "2022-11-14",
weekEndDate: "2022-11-20"
},
{
weekNo: "Nov 2022 - Week 4",
weekStartDate: "2022-11-21",
weekEndDate: "2022-11-27"
},
{
weekNo: "Nov 2022 - Week 5",
weekStartDate: "2022-11-28",
weekEndDate: "2022-11-30"
},
{
weekNo: "Dec 2022 - Week 1",
weekStartDate: "2022-12-01",
weekEndDate: "2022-12-04"
},
{
weekNo: "Dec 2022 - Week 2",
weekStartDate: "2022-12-05",
weekEndDate: "2022-12-05"
}];
根據開始日期和結束日期,我需要構造一個月歷周號、月歷開始日期和結束日期。
我的代碼:
constructWeekDataForCustomDates(startDate, endDate) {
let currentDay = moment(startDate).day(), addDays, weekArrayData = [];
if (currentDay == 0) {
addDays = 1;
}
else if (currentDay == 1) {
addDays = 0;
}
else if (currentDay == 2) {
addDays = 6;
}
else if (currentDay == 3) {
addDays = 5;
}
else if (currentDay == 4) {
addDays = 4;
}
else if (currentDay == 5) {
addDays = 3;
}
else if (currentDay == 6) {
addDays = 2;
}
while(startDate <= endDate){
weekArrayData.push({
checkboxName: this.getweekNoOfMonth(startDate),
checkboxStartValue: moment(startDate).format("YYYY-MM-DD"),
checkboxEndValue: moment(startDate).add(addDays, 'day').format("YYYY-MM-DD")
});
startDate = moment(startDate).add(addDays, 'day').format("YYYY-MM-DD");
addDays = 6;
}
console.log(weekArrayData)
}
// Function To get week no based on the date
getweekNoOfMonth (date) {
let input = moment(date)
const firstDayOfMonth = input.clone().startOf('month');
const firstDayOfWeek = firstDayOfMonth.clone().startOf('week');
const offset = firstDayOfMonth.diff(firstDayOfWeek, 'days');
return Math.ceil((input.date() offset) / 7);
}
在我的代碼中,我得到了錯誤的輸出。
uj5u.com熱心網友回復:
我們試試看。需要注意的幾點:
為了否定時區和白天時間的影響,我們必須只比較沒有時間的日期部分。這是使用 yyyy-mm-dd 格式的字串比較來完成的。
其余代碼不言自明。我希望我把所有的最終情況都做好了。
var startDate = "2022-10-21"
var endDate = "2022-12-05"
var result = getAllWeeks(startDate, endDate);
console.log(result)
function getWeekOfMonth(date) {
var d = new Date(date);
var p = new Date(date);
p.setDate(1);
var week = 1;
while (p < d) {
p.setDate(p.getDate() 1)
if (p.getDay() == 1) {
week ;
}
}
return week;
}
function formatDate(date) {
return (date.toISOString()).split("T")[0];
}
function getWeekEnd(date, maxDate) {
var p = new Date(date.getTime());
var month = p.getMonth();
while (p.getDay() != 0 && p.getMonth() == month && p < maxDate) {
p.setDate(p.getDate() 1)
}
if (p.getMonth() != month) {
p.setDate(p.getDate() - 1)
}
p = new Date(formatDate(p))
return p;
}
function getMonthName(date) {
return date.toLocaleString('default', {
month: 'short'
});
}
function getAllWeeks(startDate, endDate) {
var p = new Date(startDate);
var d = new Date(endDate);
var result = [];
while (formatDate(p) <= formatDate(d)) {
var weekEnd = getWeekEnd(p, d)
var obj = {
weekNo: getMonthName(p) " " p.getFullYear() " - Week " getWeekOfMonth(p),
weekStartDate: formatDate(p),
weekEndDate: formatDate(weekEnd),
}
result.push(obj);
p.setDate(weekEnd.getDate() 1);
}
return result;
}
.as-console-wrapper {
max-height: 100% !important
}
uj5u.com熱心網友回復:
為了完整起見,沒有圖書館的答案。
似乎周從星期一開始,一個月的第一周從 1 日開始,一直到第一個星期日,因此可能包含 1 到 7 天。同樣,最后一周是從最后一個星期一到該月的最后一天。
// Parse YYYY-MM-DD as local
function parseYMDLocal(s) {
let [y, m, d] = s.split(/\D/);
return new Date(y, m-1, d);
}
// Format date as YYY-MM-DD
function formatYMD(date) {
return date.toLocaleDateString('en-ca');
}
// Get week of month. Weeks start on Monday.
// First week starts on first of month
function getWeekOfMonth(date) {
let d = new Date(date);
d.setHours(0,0,0,0);
let monthStart = new Date(d.getFullYear(), d.getMonth());
let startMonday = new Date(monthStart.getFullYear(),
monthStart.getMonth(), monthStart.getDate() - (monthStart.getDay() || 7) 1);
// return startMonday.toDateString()
return Math.floor(Math.round((d - startMonday) / 8.64e7) / 7) 1;
}
// Return start, end of week (Monday is start of week)
// Start not before start of moth, end not after end of month
function getWeekInMonth(date) {
let weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - (date.getDay() || 7) 1);
let monthStart = new Date(date.getFullYear(), date.getMonth());
let weekEnd = new Date(date.getFullYear(), date.getMonth(), date.getDate() 7 - (date.getDay() || 7));
let monthEnd = new Date(date.getFullYear(), date.getMonth() 1, 0)
return {
weekStart: weekStart < monthStart? monthStart : weekStart,
weekEnd: weekEnd > monthEnd? monthEnd : weekEnd};
}
// Get weeks array per OP
function getWeeks(start, end) {
let s = parseYMDLocal(start);
let e = parseYMDLocal(end);
if (e < s || isNaN(s) || isNaN(e)) return;
let weeks = [];
do {
let {weekStart, weekEnd} = getWeekInMonth(s);
weekStart = weekStart < s? s : weekStart;
weekEnd = weekEnd > e? new Date(e) : weekEnd;
weeks.push({
weekNo: `${s.toLocaleString('en-au',{year:'numeric',month:'short'})} - ${getWeekOfMonth(s)}`,
weekStartDate: formatYMD(weekStart),
weekEndDate: formatYMD(weekEnd)
});
s = new Date(weekEnd.setDate(weekEnd.getDate() 1));
} while (s <= e)
return weeks;
}
// Example
let startDate = "2022-10-21";
let endDate = "2022-12-05";
console.log(getWeeks(startDate, endDate));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/521384.html
上一篇:(僅)從csv匯入后,日期索引中的某些日期被解釋錯誤
下一篇:如何僅從日期時間列中獲取日期?
