Javascript 날짜 개체의 날짜 형식을 지정하고 간격을 설정하는 방법은 무엇입니까?

Aug 21 2020

일정 신청을하고 있습니다. 요구 사항은 사용자가 두 개의 시간 프레임을 입력하고 응용 프로그램은이를 10 분 간격으로 20 분 간격으로 나누어야합니다. 예를 들어 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')
    }

답변

1 OvinusReal Aug 21 2020 at 02:16

이것은 트릭을 수행해야합니다.

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))

dateToStringDate 개체를 hh : mm 형식으로 변환하고 필요한 경우 분 구성 요소를 0으로 채 웁니다. 간격을 얻기 위해 intervalLength와 breakLength의 시간 길이를 번갈아 가며 단계별로 진행하고 생성 된 각 간격을 배열로 푸시합니다. 그런 다음 간격을 반환합니다.

RobG Aug 21 2020 at 05:10

OP의 코드가 시간을 올바르게 나누지 않거나 기간 사이의 간격을 허용하지 않는 것 같습니다.

두 날짜 사이의 시간은 n-1 10 분 간격 으로 n 개의 기간으로 분할되어야 합니다. 다른 날짜에서 하나의 날짜를 빼면 밀리 초 단위의 시간 차이가 나옵니다. 그런 다음 필요한 기간과 간격으로 나누어야합니다.

/**
 * @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));

이것은 허용되는 시간을 완전히 채우고 끝에 간격이 없음을 유의하십시오. 또한 시간은 전체 분으로 잘 리므로 분 수가 정확히 같지 않거나 같지 않은 것처럼 보일 수 있습니다.