Сравните два раза и получите следующий, используя JavaScript - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть другой набор времени: «4:30 AM», «12:30 PM», «3:30 PM», «7:00 PM» и «9:15 PM». в массиве и уже разобрали. Также я сравниваю их, но я не знаю, какую логику c использовать, чтобы получить следующий раз из текущего времени, а не из ближайших

Например, если сейчас «13:00», то предположим, что следующий быть "3:30 PM", а ближайший - "12:30"

Код, который я использую:

let times= new Array("4:30 AM", "12:30 PM", "3:30 PM" , "7:00 PM", "9:15 PM");
let currentTime = new Date();
let currentHour = parseInt(currentTime.getHours());
let availableDates = times;
let convertedHours = availableDates.map((date) => {
    let time = parseInt(date.split(' ')[0]);

    let period = date.split(' ')[1];

    if(time === 12 && period === 'pm' )
      return time;

    if(time < 12 && period === 'am')
      return time; 

    return time + 12;
});

После этого я не знаю, какие логины c добьется того, чего хочу

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Если я правильно понимаю ваш пост, вы ищете следующую ближайшую подгонку для массива строк, которые напоминают времена. Если предположить, что дни не важны, тогда работа будет выполнена с использованием встроенных js dateTimes и array.find.

По сути, я предполагаю, что нам просто нужно установить интервал в любое время, указанное в следующем ближайшем времени в массиве. Это сначала преобразует время в DateTime Objects, а затем сравнивает их с предоставленным временем из dateTime, установленного в currentTime.

let times= new Array("4:30 AM", "12:30 PM", "3:30 PM" , "7:00 PM", "9:15 PM");
const currentTime = new Date(new Date().toDateString() + ' ' + '19:30');
const availableDates = times;

const nextSlot = availableDates.find((date) => {
    let timeH = parseInt(date.split(' ')[0]);
    const timeM = parseInt(date.split(':')[1].split(' ')[0]);
    const period = date.split(' ')[1];
    if(period === "PM" && timeH !== 12) {
      timeH += 12;
    }
    const time = `${timeH}:${timeM}`

    const parseDate = new Date(new Date().toDateString() + ' ' + time);
    return currentTime < parseDate;

});

console.log("nextSlot", nextSlot);

Надеюсь, это поможет и то, что вы ищете.

1 голос
/ 21 апреля 2020

Если я правильно понимаю, надеюсь, это поможет:

let times = new Array("4:30 AM", "12:30 PM", "3:30 PM", "7:00 PM", "9:15 PM");
let currentTime = new Date();
let currentHour = parseInt(currentTime.getHours());
let availableDates = times;

function convertHour(time) {
    let parts = time.split(' ');
    time = parseInt(parts[0]);
    let period = parts[1];

    if (time === 12 && period === "PM") 
        return time;

    if (time < 12 && period === "AM") 
        return time;

    return time + 12;
}

function getNextTime(currentTime) {
    let index = -1;
    // find index of next
    for (let i = 0; i < availableDates.length; i++) {
        let converted = convertHour(availableDates[i]);
        if (converted > currentTime) {
            index = i;
            break;
        }
    }
    // return the value
    return index !== -1 ? availableDates[index] : undefined;
}
...