@VelkinVV

Как разбить интервал дат на периоды?

Помогите решить проблему.
У меня есть две даты, дата начала и дата конца.
2020-01-01T00:00:00+03:00
2022-03-15T11:58:01+03:00

Мне необходимо разбить весь промежуток по каждым 12 часам.
Т.е. в результате должен получить массив с датами от начальной, до конечной на промежутки по 12 часов.
["2020-01-01T00:00:00+03:00", "2020-01-01T12:00:00+03:00", "2020-01-02T00:00:00+03:00", "2020-01-02T12:00:00+03:00"] и т.д.

Как подобное можно реализовать на JS?
  • Вопрос задан
  • 562 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно просто прибавлять часы:
D = new Date();

D.setHours(D.getHours() + 12) // подвинули вперёд на 12 часов
даты корректируются «автомагически».

TODO: проверить, не будет ли сюрпризов в переходах на летнее/зимнее время, когда клиент в поясе, где сохранились эти переходы.
spoiler

Примерная реализация. Косяк в часовом поясе текстового представления даты: вне зависимости от входного формата, на выходе даты будут в UTC:
(
(start, finish) => {
  const date = new Date(start);
  const dateFinish = new Date(finish);
  const result = [];

  while (date <= dateFinish) {
    result.push(date.toISOString());
    date.setHours(date.getHours() + 12);
  }
  return result;
}
)('2020-01-01T00:00:00+03:00', '2020-03-15T11:58:01+03:00')
/*
Array(149) [ "2019-12-31T21:00:00.000Z", "2020-01-01T09:00:00.000Z", "2020-01-01T21:00:00.000Z", "2020-01-02T09:00:00.000Z", "2020-01-02T21:00:00.000Z", "2020-01-03T09:00:00.000Z", "2020-01-03T21:00:00.000Z", "2020-01-04T09:00:00.000Z", "2020-01-04T21:00:00.000Z", "2020-01-05T09:00:00.000Z", … ]
*/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@chelnokov_a
Преобразуй в милисекунды. Разбей на массив по шагу в 12 часов и преобразуй обратно
Ответ написан
Комментировать
hahenty
@hahenty
('•')
[...(function*(y1,m1,d1,y2,m2,d2){
  const dd1 = new Date(y1,m1,d1), dd2 = new Date(y2,m2,d2);
  let dd, h = 0;
  do{
    dd = new Date( y1,m1,d1,h,0,0 );
    h += 12;
    yield dd;
  }while(dd2>dd);
  return;
})(2020,0,1, 2020,2,16)]

как даты разбить на отдельные числа я не знаю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы