Как проверить, находится ли объект в диапазоне дат, используя фильтр? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь проверить, попадает ли текущий объект фильтра в диапазон дат и на основе логических значений возврата данных, если данные не находятся в диапазоне дат, этот объект должен быть отфильтрован.с кодом ниже всегда возвращает данные.Любая идея, что реализовано неправильно или правильный подход для достижения этой задачи?

main.ts

 function mapResponse() {
    const _startDate = "2018-12-15";
    const _endDate = "2019-01-15";
    _startDate = moment.utc(_startDate || twentyfourMonthsAgo, ["YYYY-MM-DD",  "MM-DD-YYYY", "MM/DD/YYYY"]).format("YYYY-MM-DD");
    _endDate = moment.utc(_endDate || today, ["YYYY-MM-DD",  "MM-DD-YYYY", "MM/DD/YYYY"]).format("MM/DD/YYYY");
    const response = [
            {
                rxNumber: "15139",
                rxIssueDate: "",
                fillDate: "2019-01-03",
                quantityRemaining: "3",
                prescribedNoOfRefills: "3",
                currentFillNumber: "0"
            },
            {
                rxNumber: "16131",
                rxIssueDate: "",
                fillDate: "2019-12-03",
                quantityRemaining: "3",
                prescribedNoOfRefills: "3",
                currentFillNumber: "0"
            }
        ]

        response = response.filter(
            function renameSpecialtyAttributesToPBM(specialtyRx: any) {
                const mappedRx = specialtyRx as Partial < any > ;

                const dateFilter = checkDateRange(_startDate, _endDate, specialtyRx.fillDate);

                if (!dateFilter) {
                    return false;
                }

                mappedRx.fillDate = specialtyRx.fillDate;

                mappedRx.refillEligible = !!mappedRx.refillStatusText;
                mappedRx.renewEligible = !!specialtyRenewStatus;

                return true;
            });


    }
      return response;
}

checkDateRange.ts

function checkDateRange(startDate: any, endDate: any, fillDate: RxDetailsEntity): boolean {
    if (fillDate > startDate && fillDate < endDate) {
        return true;
    }

    return false;
}

ожидаемый результат от mapResponse должен быть

response = [
                {
                    rxNumber: "15139",
                    rxIssueDate: "",
                    fillDate: "2019-01-03",
                    quantityRemaining: "3",
                    prescribedNoOfRefills: "3",
                    currentFillNumber: "0"
                }]

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Похоже, вы передаете строковые даты в функцию проверки дат и сравниваете их с операторами меньше / больше, чем здесь, в чем проблема.

Момент или более новый Luxon имеют отличные утилиты для сравнения дат, но если вы хотите сделать это старомодным способом, вы можете сделать это так:

checkDateRange(startDateString: string, endDateString: string, fillDateString: string): boolean {
    const startDate = new Date(startDateString).getTime();
    const endDate = new Date(endDateString).getTime();
    const fillDate = new Date(fillDateString).getTime();
    if (fillDate > startDate && fillDate < endDate) {
        return true;
    }

    return false;
}

the getTime() метод нативного класса javascript Date возвращает микросекунды даты начиная с эпохи unix.Таким образом, вы можете сравнивать даты численно.

Если у вас уже есть даты моментов, вы можете использовать метод isBetween моментов:

const fillDate = moment(fillDateString).utc();
return fillDate.isBetween(_startDate, _endDate);
0 голосов
/ 22 января 2019

Преобразование dateStrings в объект фактической даты. Затем выполните getTime() в эти даты, чтобы получить номер метки времени Unix. Теперь вы сможете рассчитать, находится ли одна из дат между начальной и конечной датами

...