【问题标题】:Return the number of months between two dates as an array of strings [closed]将两个日期之间的月数作为字符串数组返回 [关闭]
【发布时间】:2020-03-28 17:02:24
【问题描述】:
//So I have and array of months
 const months = [
     'January',
     'February',
     'March',
     'April',
     'May',
     'June',
     'July',
     'August',
     'September',
     'October',
     'November',
     'December'];

// If the input is startDate: 1-1-2019 & endDate: 3-15-21
// It should return an array like so:

const monthsBetweenDates = [January,February,March,April,May,June,July,August, September, October, November,December, January,February,March,April,May,June,July,August, September, October, November, December, January, Feb, March];

// The returned/new array should have all months between the start and end date above in Order, duplicated needed in order as well.

非常感谢您的帮助和时间。如果您有任何其他问题,请告诉我。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请使用tour(您将获得徽章!)并通读help center,尤其是How do I ask a good question? 您最好的选择是进行研究,search 以获取有关 SO 的相关主题,然后试一试.如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您卡在哪里。人们会很乐意提供帮助。
  • 日期是“日期”还是字符串?

标签: javascript function date calendar arr


【解决方案1】:

普通算术解


考虑到目标,我想说用基本数学解决任务比处理Date 类型更有意义。

你只需要:

  • destructure 日期字符串 (m-d-yyyy) 将开始和结束日期转换为开始/结束月份和年份(mStartyStartmEndyEnd):
const [mStart, , yStart] = start.split('-'),
      [mEnd, , yEnd] = end.split('-') 
  • 计算期间的总长度(以月为单位,包括开始和结束)
12*(yEnd-yStart)+(mEnd-mStart)+1}
  • 返回一个相应长度的array,其中每个项目将从源month数组中获取,旋转移动一个位置:
months[(mStart-1+i)%months.length]

您可以在下面找到完整的演示:

const startDate = '1-1-2019',
      endDate = '3-15-2021',
     
      monthsBetweenDates = (start,end) => {
        const months = ['January','February','March','April','May','June','July','August','September','October','November','December'],
              [mStart, , yStart] = start.split('-'),
              [mEnd, , yEnd] = end.split('-')             
        return Array.from(
          {length: 12*(yEnd-yStart)+(mEnd-mStart)+1},
          (_,i) => months[(mStart-1+i)%months.length]
        )
      }
      
console.log(monthsBetweenDates(startDate,endDate))
.as-console-wrapper{min-height:100%;}

【讨论】:

    【解决方案2】:

    function stringToDate(_date,_format,_delimiter)
    {
                var formatLowerCase=_format.toLowerCase();
                var formatItems=formatLowerCase.split(_delimiter);
                var dateItems=_date.split(_delimiter);
                var monthIndex=formatItems.indexOf("mm");
                var dayIndex=formatItems.indexOf("dd");
                var yearIndex=formatItems.indexOf("yyyy");
                var month=parseInt(dateItems[monthIndex]);
                month-=1;
                var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
                return formatedDate;
    }
    
    var startDate = stringToDate('01/01/2019','mm/dd/yyyy','/')
    var endDate   = stringToDate('08/15/2021','mm/dd/yyyy','/')
    
    var startYear  = startDate.getFullYear();
    var startMonth = startDate.getMonth();
    var endYear    = endDate.getFullYear();
    var endMonth   = endDate.getMonth();
    
    months=['JANUARY','FEBRUARY','MARCH','APRIL','MAY','JUNE','JULY','AUGUST','SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER'];
    myArray = [];
    
      for(let i=startYear;i<= endYear;i++){
         for(let j=0; j<12;j++){
           if (i == startYear && j >= startMonth)myArray.push(months[j]);
           if (i >  startYear && i <     endYear)myArray.push(months[j]);
           if (i == endYear   && j <=   endMonth)myArray.push(months[j]);
         }
      }
           
           console.log(myArray);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多