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)
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.
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
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 …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
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