【问题标题】:Generate week start date, week end date, month week no by using the given date range in javascript使用 javascript 中的给定日期范围生成周开始日期、周结束日期、月份周数
【发布时间】:2022-10-23 19:23:10
【问题描述】:

我已经给出了一个日期范围作为输入,即开始日期和结束日期,我需要构建一个包含周号和周开始日期以及周结束日期作为输出的数组。

输入:

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);
  }

在我的代码中,我得到了错误的输出。

【问题讨论】:

    标签: javascript date datetime momentjs


    【解决方案1】:

    我们试试看。需要注意的几点:

    为了否定时区和白天时间的影响,我们必须只比较没有时间的日期部分。这是使用 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
    }

    【讨论】:

      【解决方案2】:

      为了完整起见,没有图书馆的答案。

      似乎周从星期一开始,一个月的第一周从 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));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多