Вычислить уникальное время с учетом нескольких дат начала и окончания

1

Если у вас есть набор встреч с датами начала и окончания, как вы рассчитываете уникальное время для всех назначений?

Пример:

var appointments = {
    0:{"start":"2015-01-20 09:00:00","end":"2015-01-20 09:30:00"},
    1:{"start":"2015-01-20 09:15:00","end":"2015-01-20 09:42:22"},
    2:{"start":"2015-01-20 10:00:00","end":"2015-01-20 10:25:00"},
    3:{"start":"2015-01-20 10:10:00","end":"2015-01-20 10:53:00"}
}

Поэтому в этом примере я хотел бы получить уникальное значение времени (активности) 1H 35M 22S. Кто-нибудь знает какие-нибудь формулы для этого?

Пока у меня это, похоже, работает, но я думаю, что даты должны быть отсортированы по времени начала. Это самый эффективный способ рассчитать это?:

var totalElapsedAppointmentSeconds = 0;
var lastActiveTimestamp;

for (i in appointments) {
    if (totalElapsedAppointmentSeconds == 0) {
        totalElapsedAppointmentSeconds = new Date(appointments[i].end) - new Date(appointments[i].start);
        lastActiveTimestamp = new Date(appointments[i].end);
    } else {
        if (new Date(appointments[i].start) < lastActiveTimestamp) {
            if (new Date(appointments[i].end) > lastActiveTimestamp) {
                totalElapsedAppointmentSeconds += new Date(appointments[i].end) - lastActiveTimestamp;
                lastActiveTimestamp = new Date(appointments[i].end);
            } else {
                //nothing, already completely accounted for
            }
        } else {
            totalElapsedAppointmentSeconds += new Date(appointments[i].end) - new Date(appointments[i].start);
            lastActiveTimestamp = new Date(appointments[i].end);
        }
    }
}

totalElapsedAppointmentSeconds = totalElapsedAppointmentSeconds/1000;
var totalElapsedTime = Math.floor(totalElapsedAppointmentSeconds / 3600) + "H " + Math.floor((totalElapsedAppointmentSeconds % 3600)/60) + "M " + (totalElapsedAppointmentSeconds % 3600) % 60 + "S";
console.log("totalElapsedTime",totalElapsedTime);
  • 0
    Что вы уже пробовали?
  • 0
    @Hassan Единственное, о чем я могу думать, это иметь массив минут и повторять каждую дату, отмечая минуты в массиве, последующие даты будут просто перезаписывать те же минуты, когда есть наложение, поэтому в конце у меня будет массив, который дал бы мне всего уникальных минут
Теги:
datetime
math
formula

1 ответ

0
Лучший ответ

непонятно, что вы просите, но это демонстрирует расчет разницы во времени

EDIT whoops javascript говорит, что это недопустимые даты, откуда они пришли?

moment.js - хороший вариант для их анализа, если вы должны использовать их как входы

var data = {
  "appointments": {
    0:{"start":"2015-01-20 09:00:00","end":"2015-01-20 09:30:00"},
    1:{"start":"20-01-2015 09:15:00","end":"20-01-2015 09:42:22"},
    2:{"start":"20-01-2015 10:00:00","end":"20-01-2015 10:25:00"},
    3:{"start":"20-01-2015 10:10:00","end":"20-01-2015 10:53:00"},
  }
}

function secondsDifference(ts1, ts2){
  startMs = new Date(ts1).valueOf();
  endMs = new Date(ts2).valueOf();
  deltaMs = endMs - startMs;
  deltaS = deltaMs /1000;
  deltaS = Math.floor(deltaS);
  return deltaS;
}

var a = data.appointments[0];
var result = secondsDifference(a.start, a.end);
console.log('first appointment length seconds:', result)
  • 0
    Я думаю, я бы сказал, что я пытаюсь рассчитать общую активность за 1 день, но только уникальное время, поэтому исключается все время, когда встречи не происходили.
  • 0
    Есть много подходов, я бы totalElapsedAppointmentSeconds встречи, отслеживая totalElapsedAppointmentSeconds и lastActiveTimestamp . Если есть совпадение, считайте от более раннего конца встречи. Если есть разрыв, считайте от начала более поздней встречи.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню