使用日期

时间:2016-03-28 13:56:50

标签: javascript arrays date

我正在为客户端构建一个类似自定义日历的东西,它不会接受开箱即用的行为,而且我在浏览如何拼凑我需要的数组以便正确显示日期时遇到了一些麻烦。

一些背景知识:这是一个基于SharePoint的解决方案,用户在一个列表中输入旅行日期和位置,在另一个列表中输入默认位置。输出需要四周的时间跨度,显示用户在任何一天的位置,无论是这些旅行地点之一还是默认(家庭办公室)位置。

所以我对旅行列表([whereabouts])进行REST调用,一个到默认位置列表([默认值]),并在代码中做一些其他的东西来构建从今天到今天的日期数组+ 28([allDates])。

我已经尝试了一堆嵌套for循环,它并没有真正回归正确的东西。但是我需要基本上说:对于[allDates]中的每一天,[whereabouts]中的那个日期是否有事件发生?如果是,则按下事件标题。如果没有,则从[默认值]推送默认位置。

我完全迷失在这里,伙计们,任何帮助都非常感激。

修改

在回答Rajesh时,[whereabouts]是一系列具有以下属性的Events对象:

  • 日期(UTC字符串)
  • 事件长度(字符串)
  • 团队成员(字符串)
  • 标题(字符串)

[allDates]是一个日期字符串数组,从今天到今天+ 28天。

[defaults]是具有以下属性的对象数组:

  • 团队成员(字符串)
  • 位置(字符串)

我正在尝试的一个例子:

(执行REST调用并返回数据后)

function initCal(){

    //Groups returned whereabouts data into arrays per team member name.
    var grouped = _(whereabouts).groupBy(function(o){
        return o.Team_x0020_Member.Title;
    });

    //Reduces the above to something a little more simple for me to work with.
    grouped = _.pairs(grouped)          

    //Full disclosure, this is going into a google charts data table.
    var tbl = new google.visualization.DataTable();

    //Building the allDates array and adding in day names.  
    for(var i=0;i<14;i++){
        var weekday = new Array(7);
        weekday[0]=  "Sunday";
        weekday[1] = "Monday";
        weekday[2] = "Tuesday";
        weekday[3] = "Wednesday";
        weekday[4] = "Thursday";
        weekday[5] = "Friday";
        weekday[6] = "Saturday";                
        var day = today.addDays(i);
        var d = weekday[day.getDay()];
        var n = day.toLocaleDateString();
        tbl.addColumn('string',n);
    }

    //I have to do some manipulation of the object google creates.  It looks kind of weird, but the output is that allDates array.
    var allDates = [];
    var colsArr = tbl.Kf;               
    for(var i=0;i<colsArr.length;i++){
        if(colsArr[i].label != ''){
            allDates.push(colsArr[i].label);
        }
    }

    //This is ultimately where the results will go.
    var rows = [];

    //Cycle through grouped, get the current team member, then go manipulate all these arrays using getEvents. 
    for(var i=0;i<grouped.length;i++){
        var thisTM = grouped[i][0];
        var whereabouts = grouped[i][1];
        rows.push([thisTM,getEvents(whereabouts,defaults,allDates)]);
    }

    //This is just where the data table goes.       
    var table = new google.visualization.Table(document.getElementById('whereabouts'));
            table.draw(tbl, {width: '100%', height: '100%'});           

}

//Just needed something to get the day names.  Not important, left here because laziness.
Date.prototype.addDays = function(days){
    var dat = new Date(this.valueOf());
    dat.setDate(dat.getDate() + days);
    return dat;
}


function getEvents(whereabouts,defaults,allDates){
    //Figure I'll put the finished results here and return this array.
    var events = [];

    //Empty array for formatted dates.
    var evDate = [];

   //Format the whereabouts date strings into locale date strings so I can do comparisons against the allDates date strings.
   for(var i=0;i<whereabouts.length;i++){
       var formatD = new Date(whereabouts[i].Date).toLocaleDateString();
          evDate.push(formatD);
   }

   for(var i=0;i<allDates.length;i++){
       for(var j=0;j<evDate.length;j++){
          if (evDate[j] === allDates[i]){
              events.push(whereabouts[j].Title);
          } else {
              events.push(defaults.Title);
          }
      } 
   }    
}

编辑2 还有一个背景。应该返回给initCal的东西应该是一个与allDays完全相同的数组,但是包含事件标题(如果有的话)或默认位置(如果当天没有事件)。

这有意义吗?再次感谢您的帮助和反馈。

1 个答案:

答案 0 :(得分:-1)

不是真的答案,但评论不够大。

据推测,“UTC字符串”是指ISO 8601扩展格式日期,如“2016-03-29T10:43:23Z”或类似内容。大多数浏览器都会正确地解析它,但我建议你自己解析它(这里有很多问题)。

对于比较,如果您只想匹配日期(没有时间),那么可以比较相同格式的字符串,或者您可能只是获取时间值并进行比较。使用时间值的优点是您还可以使用大于和小于。请务必先将时间设置为某个常用值,例如中午(12:00:00)或午夜(00:00:00)。

无论哪种方式,写一个函数来按照你想要的方式格式化日期。

如果您不想要像moment.js这样的库(这种类型接管所有内容),那么周围有很多格式化程序和解析器,例如: Date.formatdate-format,第二个也有一个很好的小解析器。这些将与普通的Date对象一起使用,而Moment.js在Date周围创建自己的包装器。