Разница в 1 шаг между двумя датами

#javascript #typescript

#javascript #typescript

Вопрос:

Некоторая предыстория:

У меня есть точки данных (текущий день 5 дней вперед, с шагом в 3 часа (например, 22:00, 1: 00, 4: 00, 7:00 …)), которые я хочу отсортировать / сгруппировать по дате в массивы (по одному на каждую дату).

Моей первой попыткой было просто вычислить разницу двух объектов date в date, например

(datapoint.getTime() - today.getTime())/ millisecondsPerDay . Это не сработало, потому что я получаю доли дней.

Затем я перешел к Math.ceil() и Math.floor() результатам, но это, конечно (я некоторое время просматривал свой код, поэтому мой мозг тогда не распознал ошибку), тоже не сработало, потому что это поместило бы текущий день и части следующего дня в одну группу (22 вечера 3 часа не в один и тот же день, хотя разница составляет < 1 день).

Затем я провел сравнение дней следующим образом

 let diff = tmp.getDate() - today.getDate()
  

проблема с этим подходом заключается в том, что когда я нахожусь в конце месяца, а дата — в следующих месяцах, я получаю (относительно) высокие отрицательные значения, которые я не могу использовать в качестве индексов массива (например, [0,1,2,4,5,-27] ).

Вопрос

Как рассчитать разницу между двумя датами в разных шагах по дням при изменении месяца?

Комментарии:

1. Вы описали две проблемы: 1. «У меня есть точки данных… которые я хочу отсортировать / сгруппировать по дате в массивы» и 2. «Как вычислить разницу между двумя датами с различными шагами по дням …» Имея в виду проблему XY , о какой из них вы спрашиваете?

2. @JordanRunning Ну … я задал один вопрос. Но я проясню первую проблему в качестве справочной информации.

3. Пожалуйста, добавьте пример с желаемым результатом — для меня абсолютно непонятно, чего вы пытаетесь достичь. Что не так с долей дней?

Ответ №1:

Если ваши даты указаны в миллисекундах, вы можете попробовать это. Разделите обе на (24 * 3600 * 1000 ) и возьмите Math.floor() — это даст вам количество полных дней. Затем просто вычтите целевой результат из сегодняшнего результата.

Итак,

 mils_in_a_day = 24 * 3600 * 1000
today_in_days = Math.floor(today_in_mils / mils_in_a_day)
target_date_in_days = Math.floor(target_date_in_days / mils_in_a_day)
difference_in_days = target_date_in_days - today_in_days
  

Затем для сортировки вы можете сделать что-то подобное для каждого примера

 results = {}
results[difference_in_days] = target_date_in_days
  

и в итоге получается хэш, подобный этому

 { 
  '1' : [12356, 123457, 123458], 
  '2' : [234567, 234568, 234569]
}
  

Где ключи представляют разницу в днях, а значения представляют собой массивы исходных временных меток. Затем вы можете вызвать sort() для каждого из массивов для сортировки временных меток в течение нескольких дней.

Я уверен, что это не самый эффективный способ, но это должно навести вас на мысль.

Комментарии:

1. Расширяя это, вы должны быть в состоянии взять результат tmp — diff и использовать для этого getHours().