JavaScript中两个日期之间的15分钟时间间隔

6
问题:我需要创建一个数组,其中包含两个日期/时间戳之间所有15分钟时间段(日期格式:2016-08-10 16:00:00),以HH:mm格式表示,其中分钟被限制为00、15、30、45。
示例:从中午12:30到下午2:30将是>12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15
以下代码可以工作,但它没有考虑起始时间段(它总是从“00”开始)。代码已经进行了调整,以考虑它,但现在它无法正确地递增小时数。
function generateTimeSlots(s,e)
{   // create an array of timeslots (15 min interval) between 2 dates

var ckTimes = new Array();
var timeSlots = new Array();
var diff = Math.abs((new Date(e)) - (new Date(s)));
var duration = Math.floor((diff/1000)/60);
var sHour = (((s.split(' ')[1]).split(':'))[0]) * 1;
var ampm = (s.split(' '))[2];

// convert hour to 24 hour
if(ampm+'' == 'PM' ${AND} sHour != 12)
{
    sHour = sHour + 12;
}

var hours = (duration / 60);
var slots = (hours * 4); // total 15 min slots

var chunk = ['00','15','30','45'] // the four 15 min slots in a hour

// Attempt to move starting position to the correct 15 min block
// Beforehand, it would always start at the '00' slot
// i.e. 12:30 pm to 1:30pm would return 12:00,12:15,12:30,12:45
var i = "";
var startMin = (((s.split(' ')[1]).split(':'))[1])
// note platform doesn't support indexOf
for (var z = 0; 4 > z; z++){
    if (chunk[z].toString() == startMin.toString())
        i = z;
}

slots += i;

for(i;slots > i;i++)
{
    var quarter = (i % 4);
    var sMin = chunk[quarter];
    var slot = sHour+":"+sMin;
    if(ampm+'' == 'AM' ${AND} 10 > sHour)
    {
        slot = "0"+slot;
    }
    timeSlots.push(slot)

    if(hours > 1)
    {
        if(quarter == 3)
        {
            sHour++;
        }
    }
}

return timeSlots;
}

"${AND}"是怎么样的?你在使用PHP或类似的语言吗? - Karan
使用Moment.js - ManoDestra
2个回答

25

我可以建议使用moment.js吗?它会使这样的任务更加容易:

function intervals(startString, endString) {
    var start = moment(startString, 'YYYY-MM-DD hh:mm a');
    var end = moment(endString, 'YYYY-MM-DD hh:mm a');

    // round starting minutes up to nearest 15 (12 --> 15, 17 --> 30)
    // note that 59 will round up to 60, and moment.js handles that correctly
    start.minutes(Math.ceil(start.minutes() / 15) * 15);

    var result = [];

    var current = moment(start);

    while (current <= end) {
        result.push(current.format('YYYY-MM-DD HH:mm'));
        current.add(15, 'minutes');
    }

    return result;
}

console.log(intervals('2016-08-10 4:35:00 PM', '2016-08-10 8:06:00 PM'));

// Output:
// [ '2016-08-10 16:45',
//   '2016-08-10 17:00',
//   '2016-08-10 17:15',
//   '2016-08-10 17:30',
//   '2016-08-10 17:45',
//   '2016-08-10 18:00',
//   '2016-08-10 18:15',
//   '2016-08-10 18:30',
//   '2016-08-10 18:45',
//   '2016-08-10 19:00',
//   '2016-08-10 19:15',
//   '2016-08-10 19:30',
//   '2016-08-10 19:45',
//   '2016-08-10 20:00' ]

谢谢!我感觉这样的东西肯定已经存在了。我忘了提到可用的开始/结束时间仅以15分钟为增量(即他们不能选择12:35)。 - Cary Trusty

3

JS 版本。

https://jsfiddle.net/justindevs/wgk63o1y/

//Input
var startTime = "2016-08-10 02:30:00"
var endTime = "2016-08-10 04:45:00"

//Parse In
var parseIn = function(date_time){
    var d = new Date();
  d.setHours(date_time.substring(11,13));
    d.setMinutes(date_time.substring(14,16));

  return d;
}

//make list
var getTimeIntervals = function (time1, time2) {
    var arr = [];
  while(time1 < time2){
    arr.push(time1.toTimeString().substring(0,5));
    time1.setMinutes(time1.getMinutes() + 15);
  }
  return arr;
}

startTime = parseIn(startTime);
endTime = parseIn(endTime);

var intervals = getTimeIntervals(startTime, endTime);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接