אתגר: חישוב סדר אמירת תהילים בחודש אלול ועשי"ת
-
בקהילתנו ישנו סדר מיוחד לאמירת תהילים בחודש אלול (מא' לחודש, ולא מכ"ט אב - א דר"ח) ועשי"ת, כאשר על פי המנהג לא אומרים את סדר התהילים בימי שישי ושבת, למעט ערב ראש השנה וערב יום כיפור החלים ביום שישי.
נקודת ציון נוספת, ברוב קביעות השניים ישנם רק 27 סדרים, אך בשנה בה א' אלול (ב' דר"ח) חל ביום רביעי ישנו סדר נוסף, ואז סדר כ"ה מפוצל לסדר כ"ה ו כ"ו.
מצ"ב לוח מהסידור
אני צריך את הפונקציה לאפליקציה, שם אין לי כ"כ גמישות וספריות של תאריכים עבריים, וממילא אני מנסה ליצור פונקציה שבהתבסס על החודש והיום העברי הנוכחי + יום נוכחי בשבוע אוכל לבצע את החישוב.
ניסיתי כמה מהלכים שלא הצליחו ועדיין לא הסתדרתי
אני יכול לציין אותם, אבל אם כבר אז נעשה את זה כאתגר, וניתן לציבור לפתוח זוויות חדשות.
אחרת אני יעלה מה שכבר התחלתי, אך כאמור ללא הצלחה.
בהצלחה!!
יש כאן קוד שיקל להריץ טסטים, כתוב ב nodejs שעליו יותר קל לי להריץ טסטיםconst Hebcal = require('hebcal'); const moment = require('moment'); let arr = [ '20220828', // א אלול תשפב יום ראשון '20240904', //א אלול תשפד יום רביעי '20250825', // א אלול תשפה יום שני '20260814', // א אלול תשפו יום שישי ]; for (let i in arr) { const data = arr[i]; let momentDate = moment(data); let HDate = new Hebcal.HDate(momentDate.toDate()); for(let i = 0; i < 40; i++) { console.log(getElulTehilimDay(momentDate, HDate), momentDate.day(), HDate.toString()); momentDate.add(1, 'days'); HDate = new Hebcal.HDate(momentDate.toDate()); } }
וכן הקוד ב JAVA
public int getElulTehilimDay() { EventData.resetDisplaySettings(); DateHolder dh = new DateHolder(); dh.acceptCurrentDate(); if (sunset) { dh.incrementDay(1); } DateData dd = dh.dateHebrew; int weekDay = HebCalendar.getDayOfWeek(dh.dateAbsolute); //dd.month //dd.day ... return -1; }
-
זה הקוד המלא ב JS
const Hebcal = require('hebcal'); const moment = require('moment'); let gematriya = require('gematriya'); let arr = [ '20220828', // א אלול תשפב יום ראשון '20250825', // א אלול תשפה יום שני '20240904', //א אלול תשפד יום רביעי '20260814', // א אלול תשפו יום שישי ]; let days = ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז']; for (let i in arr) { const data = arr[i]; let momentDate = moment(data); let HDate = new Hebcal.HDate(momentDate.toDate()); console.log('-------------------'); for(let i = 0; i < 40; i++) { console.log(getElulTehilimDay(momentDate, HDate), days[momentDate.day()], HDate.getMonth(), gematriya(HDate.getDate())); momentDate.add(1, 'days'); HDate = new Hebcal.HDate(momentDate.toDate()); } } function getElulTehilimDay(momentDate, HDate) { let weekDay = momentDate.day(); if (HDate.getMonth() === 6 || (HDate.getMonth() === 7 && HDate.getDate() <= 9)) { // הפונקציה אמורה להחזיר את מספר היום. הימים נספרים מתחילת חודש אלול 6 ועד יום כיפור שזה תאריך 10 בחודש 7. // ימי שישי ושבת אינם נספרים וכן ימי ראש השנה 1 ו 2 בתשרי, למעט יום 29 באלול שנספר גם אם הוא חל ביום שישי וכן ערב יום כיפור if ((weekDay === 5 && HDate.getDate() !== 29 && (!(HDate.getMonth() === 7 && HDate.getDate() === 9))) || weekDay === 6 || (HDate.getMonth() === 7 && (HDate.getDate() === 1 || HDate.getDate() === 2))) { return -1; } if (HDate.getMonth() === 6) { // חודש אלול //תחילת החודש אין שארית if (HDate.getDate() <= 7) { //כל עוד לא עברה שבת אין צורך למעט את שישי ושבת //ה weekDay מתחיל מ 0 ולכן יש להוסיף 1 if (weekDay + 1 >= HDate.getDate()) { return HDate.getDate(); } else { // אם התאריך גדול משבת יש להוריד 2 return HDate.getDate() - 2; // ר"ח אלול לא יכול לצאת בשבת ולכן תמיד יש להוריד 2 } } //הפרש הימים של השארית מחלוקה לשבועות, ההפרש נמדד ג"כ האם כבר עברה שבת בתוך ימי ההפרש או עוד לא let number = HDate.getDate() % 7; if (number > weekDay && number - weekDay > 2) { number -= 2; } // הרעיון הוא חלוקה לשבועות והכפלה עד 5 כי בכל שבוע יורדים 2 ימים ואז מוסיפים את השארית הנכונה return parseInt(HDate.getDate() / 7) * 5 + number; } else { //ערב יום כיפור if (HDate.getDate() === 9) { return 28; } else if (HDate.getDate() === 8 && weekDay === 4) { // בשנה שא' אלול ביום רביעי מפצלים את סדר 25 לשניים ואז אין 25 אלא רק 26 ו 27 return 27; } else if (HDate.getDate() === 7 && weekDay === 3) { return 26; } let RoshHashana = 2; // כשחל א אלול ביום רביעי ואז ראש השנה ביום חמישי if ((HDate.getDate() === 4 && weekDay === 0 ) || (HDate.getDate() === 5 && weekDay === 1) || (HDate.getDate() === 6 && weekDay === 2) || (HDate.getDate() === 7 && weekDay === 3) || (HDate.getDate() === 8 && weekDay === 4)) { RoshHashana = 1; } // כשחל א אלול ביום שישי, ראש השנה חל ביום ראשון if ((HDate.getDate() === 3 && weekDay === 1 ) || (HDate.getDate() === 4 && weekDay === 2) || (HDate.getDate() === 5 && weekDay === 3) || (HDate.getDate() === 6 && weekDay === 4)) { RoshHashana = 0; } // למעשה בחודש אלול יש תמיד 21 סדרים לא משנה באיזה קביעות שנים, וממילא תשרי מתחיל תמיד ב 22 if (HDate.getDate() <= 7) { if (weekDay >= HDate.getDate()) { return 21 + HDate.getDate() - RoshHashana; } else { return 21 + HDate.getDate() - 2 - RoshHashana; } } return (21 + parseInt(HDate.getDate() / 7) * 5 + (HDate.getDate() % 7)) - RoshHashana; } } // return -1; }