在两个日期之间创建可用时隙数组

时间:2015-08-07 18:25:00

标签: javascript jquery

我在前端工作上很弱,需要一点帮助。

我正在开发一个基本表单,为用户提供在接下来3天内预约的预约时间表。

所以我到目前为止写道:

    var today = new Date();

    var lastday = new Date(today);
    lastday.setDate(today.getDate() + 4);

    var daterange = getAllDays(today, lastday);

    function getAllDays(today, lastday)
    {
        var s = new Date(today);
        var e = new Date(lastday);
        var a = [];


        //this gets my start time days
        while (s < e)
        {

            //if day Saturday hours change
            if(s.getDay() == 0)
            {
                //if Sunday skip
            }
            else if (s.getDay() == 6)
            {
                //push start onto array
                a.push(setWorkingHours(s, '10'));

                //push end onto array
                a.push(setWorkingHours(s, '20'));
            }
            else
            {
                //push start onto array
                a.push(setWorkingHours(s, '13'));

                //push end onto array
                a.push(setWorkingHours(s, '20'));
            }


            s = new Date(s.setDate(s.getDate() + 1))

        }

        return a;

    };


    function setWorkingHours(date, hour)
    {
        var dateTime = new Date();
        dateTime.setDate(date.getDate());
        dateTime.setHours(hour, '0', '0');

        return dateTime;
    }


alert(daterange.join('\n'));

Here is a fiddle.

现在我知道这可以使用细化,我愿意接受任何改进。

所以上面的代码给我一个带有开始和停止时间的Days数组。现在,我正在努力弄清楚我将如何在每天的开始和停止时间内获得一系列的小时数。

此外,一旦我有时间,我就会查询返回事件的Google日历,以便我将其解析为数组。

即将举行的活动: Bob Builder(2015-08-07T10:00:00-08:00) John Doe(2015-08-08T11:00:00-08:00) 玛丽珍(2015-08-10T18:00:00-08:00)

最后我需要&#34;交叉&#34;带有预订数组的可用数组并返回剩下的内容。

至于约会本身。如果一个人选择了一个时间,我会安排两个小时的时间。约会可以从一小时的顶部或底部开始。

2 个答案:

答案 0 :(得分:3)

我会使用下面getTimeSlotsForDay函数的某些内容来获取给定日期的可用开始时间数组。

var GoogleCalenderAppointments = null;
var today = new Date();
var lastDay = new Date(today);
lastDay.setDate(today.getDate() + 4);

function checkGoogleCalendarConflict(date) {
  var hasConflict = false;
  if (!GoogleCalenderAppointments) {
    //logic to get scheduled appointments
  }

  //iterate through relevant scheduled appointments
  //if argument `date` has conflict, return true
  //else, return false

  return hasConflict
}

function getTimeSlotsForDay(date) {
  var timeSlots = []
  var dayStart = new Date(date)
  var dayEnd = new Date(date)

  switch (date.getDay()) {
    case 0: //Sunday
      return timeSlots;
    case 6: //Saturday
      dayStart.setHours(10, 0, 0, 0)
      dayEnd.setHours(20, 0, 0, 0)
      break;
    default:
      dayStart.setHours(13, 0, 0, 0)
      dayEnd.setHours(20, 0, 0, 0)
  }
  do {
    if (!checkGoogleCalendarConflict(dayStart)) {
      timeSlots.push(new Date(dayStart))
    }
    dayStart.setHours(dayStart.getHours(), dayStart.getMinutes() + 30)
  } while (dayStart < dayEnd);

  return timeSlots
}

var message = ""
for (var i = new Date(today); i < lastDay; i.setDate(i.getDate() + 1)) {
  message += i.toDateString() + ":\n"
  message += getTimeSlotsForDay(i).map(function(it) {
    return it.toTimeString();
  }).join(",\n") + "\n";
}
alert(message)

答案 1 :(得分:-1)

参考你的数组问题,制作一个天数组的对象。导入momentjs。创建一个包含开始和结束的两项数组。他们的日期对象更加饱满,它们具有很好的功能。

Calendar = { 
January-1: [[new Date(), new Date() ],  [new Date(),    new Date() ]] 
} 

对于第二部分,underscorejs很好。使用_.zip(数组,数组)。 (您需要格式化Google数组以匹配您的数组

我希望我能正确理解这一点,我是新来的。 Wew84