Получить все даты между двумя датами Javascript

У меня проблемы с функцией, которая должна отображать даты между двумя датами

Я определил ошибку, и это зависит от времени даты начала.

function getDatesInRange(startDate, endDate) {
 const date = new Date(startDate.getTime());

 const dates = [];

 while (date <= endDate) {
  dates.push(new Date(date));
  date.setDate(date.getDate() + 1);
 }

 return dates;
}

const d1 = new Date(doc.travel_start);
const d2 = new Date(doc.travel_end);

getDatesInRange(d1, d2)

travel_end: "2022-03-23T20:00:57.118Z" travel_start: "2022-03-20T05:59:57.118Z",

Правильный вывод: [ 2022-03-20T05:59:57.118Z, 2022-03-21T05:59:57.118Z, 2022-03-22T05:59:57.118Z, 2022-03-23T05:59:57.118Z ]

Если я изменю метку времени travel_start на 23 часа, последняя дата моего массива отсутствует. [ 2022-03-20T21:59:57.118Z, 2022-03-21T21:59:57.118Z, 2022-03-22T21:59:57.118Z ]

Я безуспешно пытался удалить метку времени из travel_start с помощью .setHours(0,0,0,0).

это правильно, в последней итерации начало больше, чем конец (23:00 23 марта > 5:59 23 марта)

shutsman 22.03.2022 10:11

@shutsman Значит, мне нужно инициализировать даты? start.setHours(0,0,0,0);end.setHours(0,0,0,0); Или есть лучший подход?

Pim 22.03.2022 11:22

честно говоря не понятно для меня зачем указывать последнюю дату если она вне диапазона

shutsman 22.03.2022 11:32

Вы могли бы сделать dates.push(new Date(date.setDate(date.getDate() + 1))). ;-)

RobG 22.03.2022 11:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

ты на правильном пути

setHours может возникнуть проблема с часовым поясом, попробуйте использовать setUTCHours;

и сбрасывать даты начала и окончания перед любыми расчетами

проверять:

function getDatesInRange(startDate, endDate) {
    const start = new Date(new Date(startDate).setUTCHours(0, 0, 0, 0));
    const end = new Date(new Date(endDate).setUTCHours(0, 0, 0, 0));
    
 const date = new Date(start.getTime());

 const dates = [];

 while (date <= end) {
  dates.push(new Date(date));
  date.setDate(date.getDate() + 1);
 }

 return dates;
}

const travel_start = "2022-03-20T05:59:57.118Z";
const travel_start2   = "2022-03-20T23:59:57.118Z";

const travel_end = "2022-03-23T20:00:57.118Z"; 

const res1 = getDatesInRange(travel_start, travel_end);
const res2 = getDatesInRange(travel_start2,travel_end);

console.info('res1', res1)
console.info('res2', res2)

если это поможет отметить как правильное)

shutsman 22.03.2022 12:47

Ваше предложение использовать UTC является хорошим, но затем вы возвращаетесь к локальным методам в цикле, подумайте date.setUTCDate(date.getUTCDate() + 1). При переходе на летнее время местный день длится менее 24 часов, поэтому полный день UTC не добавляется, выход на улицу - наоборот. ;-)

RobG 23.03.2022 00:40

Если вы не против использования внешних библиотек, у date-fns есть много полезных функций, включая то, что вы хотите сделать.

пример:

import { eachDayOfInterval } from "date-fns";

function getDatesInRange(startDate, endDate) {
    return eachDayOfInterval({
        start: new Date(startDate),
        end: new Date(endDate)
    })
} 

getDatesInRange(d1, d2)

В противном случае ответ шутерский имеет смысл.

Другие вопросы по теме