From 7c86397e32f105b7aca8adbb1c5e254260e6b215 Mon Sep 17 00:00:00 2001 From: zv Date: Thu, 11 Jun 2026 18:00:16 +0200 Subject: [PATCH] Fix upcoming forecast hour filtering --- lib/forecast-utils.ts | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/forecast-utils.ts b/lib/forecast-utils.ts index d7b0f2a..a3600a9 100644 --- a/lib/forecast-utils.ts +++ b/lib/forecast-utils.ts @@ -50,9 +50,40 @@ function getWarsawForecastHour(date = new Date()) { return `${getPart("year")}-${getPart("month")}-${getPart("day")}T${getPart("hour")}:00`; } +function parseForecastHour(time: string) { + const match = time.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/); + if (!match) return null; + const [, year, month, day, hour, minute] = match; + const timestamp = Date.UTC(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute)); + return Number.isFinite(timestamp) ? timestamp : null; +} + +function getForecastHourOfDay(time: string) { + const match = time.match(/T(\d{2}):/); + return match ? Number(match[1]) : null; +} + export function getUpcomingHourlyForecast(hours: HourlyForecast[], limit = 24) { const currentHour = getWarsawForecastHour(); - return hours.filter((hour) => hour.time >= currentHour).slice(0, limit); + const currentTimestamp = parseForecastHour(currentHour); + const upcomingHours = currentTimestamp === null + ? hours.filter((hour) => hour.time >= currentHour) + : hours.filter((hour) => { + const hourTimestamp = parseForecastHour(hour.time); + return hourTimestamp === null ? hour.time >= currentHour : hourTimestamp >= currentTimestamp; + }); + + if (upcomingHours.length) return upcomingHours.slice(0, limit); + + const currentHourOfDay = getForecastHourOfDay(currentHour); + const fallbackHours = currentHourOfDay === null + ? hours + : hours.filter((hour) => { + const forecastHourOfDay = getForecastHourOfDay(hour.time); + return forecastHourOfDay === null || forecastHourOfDay >= currentHourOfDay; + }); + + return (fallbackHours.length ? fallbackHours : hours).slice(0, limit); } export function getHourlyForecastForDay(hours: HourlyForecast[], date: string) {