#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().