Porównanie kilku zapisanych dat z aktualną

Witam chciałbym stworzyć coś w stylu przypomnienia o ważnych datach. Całość ma działać tak że codziennie sprawdzane są zdefiniowane wydarzenia i jeżeli któreś pokrywa się z aktualną datą mam dostać powiadomienie. (Dodam, że nie chcę korzystać z kalendarza Google)

const wydarzenia = [
    { name: "Wydarzenie1", miesiac: 7, dzien: 18 },
    { name: "Wydarzenie2", miesiac: 7, dzien: 4 },
];

const aktualnadata = new Date();

wydarzenia.find((it) => {

    if (it.dzien == aktualnadata.getDay() && it.miesiac == aktualnadata.getMonth()) {
        msg.payload = 'Dzisiejsze wydarzenie to: ' + it.name;
        
    } else {
        msg.payload = 'Brak wydarzeń.';
    }
})
return msg;

Problem w tym, że ciągle otrzymuję informację ‘Brak wydarzeń’. Czy mógł by ktoś rzucić okiem gdzie popełniłem błąd w kodzie sprawdzającym daty ?

Skorzystaj z gotowej integracji w HACS Anniversaries.

Zainstalowałem, widzę że tworzone są pojedyncze encje z liczbą dni jaka pozostała do danego wydarzenia. I tutaj nasuwa się kolejny problem. Jak powiadamiać że dzisiejsze wydarzenie pokrywa się z obecną datą oraz jak automatycznie wykrywać nowo dodane encje poprzez Node Red ?

Dla uproszczenia zmień sposób zapisu dat. Zapisuj jako pojedyńczą liczbe np 18 lipca zapisz jako 718,… 6 grudnia jako 1206. Bieżąca date konwertuj też na liczbe = miesiąc*100 + dzień miesiąca . Wtedy w prosty sposób porównujesz daty jako zwykłe dwie liczby. Działa zawsze powieważ każda data to unikatowa liczba.

Przerobiłem co nie co kod i działa lecz nie do końca :

const wydarzenia = [
    { name: "Wydarzenie1", miesiac: 6, dzien: 17 },
    { name: "Wydarzenie2", miesiac: 7, dzien: 18 },
];

var aktualnadata = new Date();
var month = aktualnadata.getMonth() + 1;

wydarzenia.find((it) => {

    if (it.dzien == aktualnadata.getDate() && it.miesiac == month) {
        msg.payload = 'Dzisiejsze wydarzenie to: ' + it.name;

    } else {
        msg.payload = 'Brak wydarzeń.';
    }
})
return msg;

Problem w tym że kiedy mam stałe wydarzenia zdefiniowane tak jak teraz :

    { name: "Wydarzenie1", miesiac: 6, dzien: 17 },
    { name: "Wydarzenie2", miesiac: 7, dzien: 18 },

to dostanę informację : “Dzisiejsze wydarzenie to: Wydarzenie2” - czyli tak jak powinno być.
kiedy zaś do stałych dodam kolejną linijkę :

    { name: "Wydarzenie1", miesiac: 6, dzien: 17 },
    { name: "Wydarzenie2", miesiac: 7, dzien: 18 },
    { name: "Wydarzenie3", miesiac: 8, dzien: 20 },

Otrzymuję wiadomość : “Brak wydarzeń.” gdzie Wydarzenie2 powinno być wyświetlone.
Wychodzi na to, że sprawdzana jest tylko ostatnia linijka zdefiniowanych Wydarzeń w tablicy i porównywana z datą a mi zależy żeby wszystkie z tablicy po kolei były sprawdzane :confused:

Mógłbyś pokazać skąd wziąłeś przykład aby uwikłać warunek wyszukiwania elementu z wykonywanym kodem?
Jeśli zapiszesz to jak mówią poradniki -działa.

const wydarzenia = [
    { name: "Wydarzenie1", miesiac: 6, dzien: 17 },
    { name: "Wydarzenie2", miesiac: 7, dzien: 19 },
    { name: "Wydarzenie3", miesiac: 8, dzien: 20 }
];

var aktualnadata = new Date();
var month = aktualnadata.getMonth() + 1;

var result = wydarzenia.find(it => (it.dzien == aktualnadata.getDate() && it.miesiac == month));

if (result != null){
    msg.payload = 'Dzisiejsze wydarzenie to: ' + result.name;

} else {
    msg.payload = 'Brak wydarzeń.';
}
return msg;

Dziękuję o to chodziło, działa.
Dodatkowo dodałem trochę kodu który informuje o zbliżającym się wydarzeniu 3 dni przed jego datą.
(choć wydaje mi się że nie zadziała to dobrze przy końcówce miesiąca gdy obecny dzień to będzie np. 31 lipca, a wydarzenie będzie np. 2 sierpnia)

const wydarzenia = [
    { name: "Wydarzenie1", miesiac: 8, dzien: 16 },
    { name: "Wydarzenie2", miesiac: 8, dzien: 19 },
    { name: "Wydarzenie3", miesiac: 7, dzien: 19 }
];

var aktualnadata = new Date();
var month = aktualnadata.getMonth() + 1;

var najblizsze = aktualnadata.getDate() + 3;

var result1 = wydarzenia.find(it => (it.dzien == aktualnadata.getDate() && it.miesiac == month));
var result2 = wydarzenia.find(it => (it.dzien == najblizsze && it.miesiac == month));

if (result1 != null && result2 != null) {
    msg.payload = 'Dzisiejsze wydarzenie to: ' + result1.name + '. Najbliższe to ' +result2.name;
}

else if (result1 != null) {
       msg.payload = 'Dzisiejsze wydarzenie to: ' + result1.name;
}   
else if (result2 != null) {
           msg.payload = 'Najbliższe wydarzenie to: ' + result2.name;

} else {
    msg.payload = 'Brak wydarzeń.';
}

return msg;

… tak :slight_smile: …dlatego pisałem abyś zmienił sposób zapisania dat.
Sprawdź tą funkcję, która upraszcza operowanie na “przeszłości, teraźniejszości i przyszłości” bez używania arytmetyki czasu.

const wydarzenia = [
    { name: "Wydarzenie1", data: 617, miesiac: 6, dzien: 17 },
    { name: "Wydarzenie2", data: 719, miesiac: 7, dzien: 19 },
    { name: "Wydarzenie3", data: 802, miesiac: 8, dzien: 2 }
];

var aktualnadata = new Date();
var dzis = (aktualnadata.getMonth() + 1) * 100 + aktualnadata.getDate();

var result = wydarzenia.find(it => (it.data > dzis));

if (result != null){
    msg.payload = 'Następne wydarzenie to: ' + result.name;

} else {
    msg.payload = 'Brak wydarzeń.';
}
return msg;

Faktycznie już rozumiem, dziękuję Ci za pomoc :slight_smile:
A ostatnie pytanie, na tym przykładzie co podałeś cały czas zwraca informację że najbliższe wydarzenie to Wydarzenie3.
A mi zależy aby tylko 3 dni przed tym wydarzeniem dostawał powiadomienie o zbliżającym się.

Niestety to jest uproszczona forma określania czy zdarzenie jest przed/teraz/po (nawet nie uwzględnia przełomu roku).
Wszystko zależy od wymagań, chciałem tylko pokazać, że można inaczej i nieraz prościej.
Arytmetyka dni potrzebuje znajomości ilości dni w miesiącu. Oczywiście można utworzyć odpowiednią formułę… ale to się mija z celem i łatwiej użyć gotowych funckji klasy date