Как форматировать даты в объекте даты Javascript и работать с установкой интервалов между ними?
Я делаю приложение для планирования. Требование заключается в том, что пользователь вводит два таймфрейма, и приложение должно разделить их на интервалы по 20 с 10-минутным перерывом между ними. Например, если я ввожу 15: 15-17: 15, это должно дать мне такие слоты: ['15: 15 ', '15: 35', '15: 45 ', '16: 55'].
Ошибки, с которыми я сталкиваюсь: подход, который я использую, отлично подходит для установки интервалов, но не может дать 10-минутный перерыв между ними. Мой вывод дает [«15:15», «15:35», «15:55», «16:15», «16:35», «16:55», «17:15»]. Далее, если я введу время окончания как 17:05, результат все равно даст окончательный счет как 17:15.
Наконец, если две вышеуказанные проблемы будут решены, я был бы благодарен, если бы кто-нибудь сказал мне, как мне отформатировать массив, чтобы я мог получить результат как: ['15: 15-15: 35 ', '15: 45-16: 55 ']. TIA
let date1 = new Date(2020, 8, 20, 15, 15);
let date2 = new Date(2020, 8, 20, 17, 05);
let slots = []
if(date1 < date2){
console.log((date2.getHours()*60 - date1.getHours()*60)/20)
for(var i = 0; date1 < date2; i=20)
{
date1.setMinutes(date1.getMinutes()+i)
slots.push(date1.getHours() + ':' + date1.getMinutes());
}
console.log(slots)
}
else{
console.log('End time should be greater than start time')
}
Ответы
Это должно помочь:
const dateToString = date => date.getHours() + ':' + (date.getMinutes() + '').padStart(2, '0')
const date1 = new Date(2020, 8, 20, 15, 15);
const date2 = new Date(2020, 8, 20, 17, 05);
function getIntervals(date1, date2) {
date1 = new Date(date1.getTime()) // so we don't mutate date1
const intervalLength = 20, breakLength = 10, intervals = []
let interval
while (date1 < date2) {
interval && intervals.push(interval)
interval = [intervalLength, breakLength].map(len => {
const str = dateToString(date1)
date1.setMinutes(date1.getMinutes() + len)
return str
}).join('-') // - separator
}
return intervals
}
console.log(getIntervals(date1, date2))
dateToString
преобразует объект Date в формат чч: мм, при необходимости дополняя минутный компонент нулями. Чтобы получить интервалы, мы пошагово чередуем промежутки времени intervalLength и breakLength и помещаем каждый сгенерированный интервал в наш массив. Затем мы возвращаем интервал.
Код в OP, похоже, неправильно разделяет время или допускает интервалы между периодами.
Время между двумя датами необходимо разбить на n периодов с n-1 10-минутными перерывами между ними. Вычитание одной даты из другой даст разницу во времени в миллисекундах, затем ее нужно разделить на требуемые периоды и интервалы, например
/**
* @param {Date} start - start date and time
* @param {Date} end - end date and time
* @param {number} periods - number of periods
* @param {number} interval - interval between periods in minutes
* @returns {Array} array of perids with interval gap between
* in format ['HH:mm - HH:mm', ...]
*/
function getSlots(start, end, periods, interval) {
// Function to format period timestamp
function f(d) {
return ('' + d.getHours()).padStart(2, '0') + ':' + ('' + d.getMinutes()).padStart(2, '0');
}
let slots = [];
let diff = end - start;
if (diff < 0) return 'End must be after start';
// Get length of interval in ms
let intLength = interval * 6e4;
// Get total length of intervals in ms
let intTotal = (periods - 1) * intLength;
// Get length of each period in ms
let periodLength = (diff - intTotal) / periods;
// Generate periods
for (let e, s = new Date(start), i = periods; i > 0; i--) {
// Copy start to get end and add length of period
e = new Date(+s + periodLength);
// Write period to slots array
slots.push(f(s) + '-' + f(e));
// Increment s to start of next period
s.setMilliseconds(s.getMilliseconds() + periodLength + intLength);
}
return slots;
}
let date1 = new Date(2020, 8, 20, 15, 15);
let date2 = new Date(2020, 8, 20, 17, 5);
console.log(getSlots(date1, date2, 2, 10));
Обратите внимание, что это полностью заполняет отведенное время, на концах нет интервалов. Кроме того, время сокращается до целых минут, поэтому может показаться, что количество минут не одинаковое или не одинаковое.