У меня проблемы с функцией, которая должна отображать даты между двумя датами
Я определил ошибку, и это зависит от времени даты начала.
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).
@shutsman Значит, мне нужно инициализировать даты? start.setHours(0,0,0,0);
end.setHours(0,0,0,0);
Или есть лучший подход?
честно говоря не понятно для меня зачем указывать последнюю дату если она вне диапазона
Вы могли бы сделать dates.push(new Date(date.setDate(date.getDate() + 1)))
. ;-)
ты на правильном пути
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)
если это поможет отметить как правильное)
Ваше предложение использовать UTC является хорошим, но затем вы возвращаетесь к локальным методам в цикле, подумайте date.setUTCDate(date.getUTCDate() + 1)
. При переходе на летнее время местный день длится менее 24 часов, поэтому полный день UTC не добавляется, выход на улицу - наоборот. ;-)
Если вы не против использования внешних библиотек, у date-fns
есть много полезных функций, включая то, что вы хотите сделать.
пример:
import { eachDayOfInterval } from "date-fns";
function getDatesInRange(startDate, endDate) {
return eachDayOfInterval({
start: new Date(startDate),
end: new Date(endDate)
})
}
getDatesInRange(d1, d2)
В противном случае ответ шутерский имеет смысл.
это правильно, в последней итерации начало больше, чем конец (23:00 23 марта > 5:59 23 марта)