Bagaimana memformat tanggal dalam objek tanggal Javascript dan bekerja dengan mengatur interval di antara mereka?

Aug 21 2020

Saya membuat aplikasi penjadwalan. Persyaratannya adalah pengguna memasukkan dua kerangka waktu dan aplikasi harus membaginya menjadi interval 20 dengan jeda 10 menit di antaranya. Misalnya, jika saya memasukkan 15: 15-17: 15, itu akan memberi saya slot seperti: ['15: 15 ', '15: 35', '15: 45 ', '16: 55'].

Kesalahan yang saya hadapi: Pendekatan yang saya gunakan berfungsi dengan baik untuk mengatur interval tetapi tidak dapat memberikan jeda 10 menit di antaranya. Output saya memberikan ["15:15", "15:35", "15:55", "16:15", "16:35", "16:55", "17:15"]. Selanjutnya jika saya memasukkan waktu akhir sebagai 17:05, hasilnya masih memberikan hitungan akhir sebagai 17:15.

Terakhir jika dua masalah di atas diselesaikan, saya akan berterima kasih jika seseorang dapat memberi tahu saya bagaimana saya memformat array sehingga saya dapat menghasilkan seperti: ['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')
    }

Jawaban

1 OvinusReal Aug 21 2020 at 02:16

Ini harus melakukan trik:

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

dateToStringmengonversi objek Tanggal ke dalam format jj: mm, mengisi komponen menit dengan nol jika perlu. Untuk mendapatkan interval, kita melangkah melalui selang waktu selangLength dan breakLength dan mendorong setiap interval yang dihasilkan ke array kita. Kami kemudian mengembalikan interval.

RobG Aug 21 2020 at 05:10

Kode di OP tampaknya tidak membagi waktu dengan benar atau memungkinkan interval antar periode.

Waktu antara dua tanggal perlu dipecah menjadi n periode dengan n-1 jeda 10 menit di antaranya. Mengurangkan satu tanggal dari yang lain akan memberikan perbedaan waktu dalam milidetik, kemudian perlu dibagi menjadi periode dan interval yang diperlukan, misalnya

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

Perhatikan bahwa ini sepenuhnya mengisi waktu yang diizinkan, tidak ada interval di akhir. Selain itu, waktu dipangkas menjadi menit penuh, sehingga mungkin tampak tidak memiliki jumlah menit yang persis sama atau sama.