Выполняя ваш код и заменяя Date.now()
на new Date('Wed Jul 08 2020 01:31:04 GMT+0200')
, я получаю «восход». Это связано с тем, что для аккумулятора, передаваемого в reduce , нет начального значения, поэтому передаются первые два элемента Object.entries(times)
, а ['sunrise', 'Wed Jul 08 2020 05:17:15 GMT+0200']
изначально присваивается аккумулятору. Текущее значение не соответствует критериям для замены начального аккумулятора, поэтому оно возвращается. 1027 * должен остановиться, как только будет найдено подходящее значение.
Следующее использует findIndex для получения первой фазы после прошедшей даты (по умолчанию текущая дата и время), затем переходит к предыдущей фазе. Если нет фазы ни до, ни после даты, используется последняя фаза.
Я также добавил сортировку, чтобы гарантировать, что записи правильно упорядочены.
let times = {
"sunrise": new Date('Wed Jul 08 2020 05:17:15 GMT+0200'),
"goldenHourEnd": new Date('Wed Jul 08 2020 06:12:13 GMT+0200'),
"morning": new Date('Wed Jul 08 2020 08:04:20 GMT+0200'),
"solarNoon": new Date('Wed Jul 08 2020 13:35:04 GMT+0200'),
"evening": new Date('Wed Jul 08 2020 19:05:48 GMT+0200'),
"goldenHour": new Date('Wed Jul 08 2020 20:57:55 GMT+0200'),
"sunset": new Date('Wed Jul 08 2020 21:52:53 GMT+0200'),
"nauticalDusk": new Date('Wed Jul 08 2020 23:57:10 GMT+0200')
};
function getCurrentTimePhase(data, date = new Date()) {
// Ensure phases are sorted by date and time
let entries = Object.entries(data).sort((a, b) => a[1] - b[1]);
// Find index of first phase that is after date
let i = entries.findIndex(phase => date - phase[1] < 0);
// Return phase prior to the one found
// If no prior phase, or none found (i == -1), return last phase
return entries[i <= 0? entries.length - 1 : i-1][0];
}
// Test dates
[new Date('Wed Jul 08 2020 01:31:04 GMT+0200'), // Before sunrise, return nauticalDusk
new Date('Wed Jul 08 2020 06:12:12 GMT+0200'), // After sunrise, before goldenHourEnd, return sunrise
new Date('Wed Jul 08 2020 13:35:05 GMT+0200'), // After solarNoon, before evening, return solarNoon
new Date('Wed Jul 08 2020 21:52:54 GMT+0200'), // After sunset, before goldenHourEnd, return sunset
new Date('Wed Jul 08 2020 23:57:15 GMT+0200') // After nauticalDusk, return nauticalDusk
].forEach(d => console.log(getCurrentTimePhase(times, d)));