חישוב התאריך העברי
הפונקציה
GetHDate שלהלן מחשבת את התאריך העברי ע"פ התאריך הגרגוריאני (הלועזי). כמו כן מחזירה הפונקציה את היום והשנה העבריים בגימטריה, את שם החודש העברי ושם חג יהודי או ישראלי החל באותו היום.דרישות הפעלה
לצורך השימוש בפונקציה יש צורך ב-
Visual Basic בגירסה 3 ומעלה או ב-Visual Basic for Applications המצורף לOffice 97-. כמובן שכדי לראות את האותיות העבריות דרוש Windows עם תמיכה בעברית.הוראות הפעלה
Dim silvester As HDateType
silvester = GetHDate(#12-31-97#)
silvester.day - היום בחודש העברי
silvester.hday - היום בחודש העברי בגימטריה
silvester.month - מספר החודש העברי
silvester.hmonth - שם החודש העברי
silvester.year - השנה העברית (מספר השנים מבריאת העולם)
silvester.hyear - השנה העברית בגימטריה
בכל שאלה ובקשה ניתן לפנות לדורון סער ב-
saar3@hotmail.com..פירסום זה הוא בגדר שירות ואינו קשור בהתחייבות כלשהי. המשתמש בחומר זה עושה זאת על אחריותו הבלעדית.
'********************************************************************
'********************************************************************
'הגדרות כלליות
Type HDateType
Year As Integer 'מספר השנה (5000..)
HYear As String * 5 ' השנה בגימטריה (תשנח)
Day As Integer 'מספר היום
HDay As String * 2 'היום בגימטריה
Month As Single 'מספר החודש (תשרי=1
'אדר=6, אדר א=6.1 אדר ב=6.2)
HMonth As String 'שם החודש
Holiday As String 'חג יהודי או ישראלי החל באותו היום
End Type
'.החזר את המספר באופן גימטרי באותיות
'הפונקציה רקורסיבית כדי לכלול ערכים הגדולים
'או שווים לאלף
Function GetGimatrics$(ByVal Num%)
'Num% - מספר שלם להמרה
Dim r$
Dim Digit%
r$ = ""
'אם המספר גדול (או שווה) לאלף, מצא את הגימטריה של
'החלוקה השלמה של המספר באלף
If Num% >= 1000 Then
r$ = GetGimatrics$(Num% \ 1000)
Num = Num Mod 1000
End If
'ספרת המאות
'אם המספר גדול או שווה ל-900, הוסף קדומת של
'האותיות תתק
If Num% >= 900 Then r$ = r$ + "תתק"
'אם המספר גדול או שווה ל-500, הוסף קדומת של
'האות ת' ואות נוספת בין ק-ת
If Num% >= 500 And Num% < 900 Then
r$ = r$ + "ת"
r$ = r$ + Chr$(Asc("ק") + (Num \ 100 - 5))
End If
'אם המספר גדול מ-100 הוסף אות בין ק-ת
If Num >= 100 And Num < 500 Then
r$ = r$ + Chr$(Asc("ק") + (Num \ 100 - 1))
End If
'ספרת העשרות
'אם המספר ללא מאות גדול מ-10 הוסף את האות המתאימה
Digit = (Num Mod 100) \ 10
If Digit Then
Select Case Digit 'הספרה
Case 1: r$ = r$ + "י"
Case 2: r$ = r$ + "כ"
Case 3: r$ = r$ + "ל"
Case 4: r$ = r$ + "מ"
Case 5 To 7: r$ = r$ + Chr$(Asc("נ") + Digit - 5)
Case 8: r$ = r$ + "פ"
Case 9: r$ = r$ + "צ"
End Select
End If
'אם יש ספרת אחדות הוסף אותה
Digit = (Num Mod 10)
If Digit Then r$ = r$ + Chr$(Asc("א") + Digit - 1)
'מנע יה ויו
If r$ = "יה" Then r$ = "טו"
If r$ = "יו" Then r$ = "טז"
GetGimatrics = r$
End Function
'ממיר תאריך גרגוריאני לתאריך עברי
'HDateType מחזיר ערך מטיפוס
'הכולל גם את התאריך בגימטריה, את שם
'החודש העברי ושם חג החל באותו היום
Function GetHDate(ByVal GDate As Date) As HDateType
Dim HDate As HDateType 'התאריך העברי
Dim JDate As Date 'התאריך היוליאני
Dim PDate As Date 'התאריך היוליאני של טו בניסן אותה השנה
Dim PDis As Integer 'כמה ימים באותה השנה צריך לחכות מפסח
Dim PPDate As Date 'התאריך היוליאני של הפסח הקודם
Dim LYL% 'אורך השנה העברית האחרונה
Dim KislevL%, HeshvanL% 'מספר הימים בחשוון ובכיסלו
'ערכי ברירת מחדל
KislevL = 30: HeshvanL = 29 'שנה כסדרה
'חישוב הלוח היוליאני בהתאם להפרש הקבוע
JDate = GDate - 13
'חישוב השנה העברית
HDate.Year = Year(JDate) + 3760
'יתכן יהיה צורך להוסיף 1 למספר זה, אם התאריך חל
'לאחר תחילת השנה העברית הבאה
GetHDate 'חשב את התאריך היוליאני של טו בניסן אותה השנה
PDate = GetPDate(HDate.Year)
'כמה ימים אחרי פסח נמצא התאריך המבוקש
PDis = JDate - PDate
'אם הפער גדול מ 162 ימים יש לעבור לשנה הבאה
If PDis > 162 Then
HDate.Year = Year(JDate) + 3761
GoTo GetHDate End If
'הצב את טו בניסן והוסף את מספר הימים הדרוש
HDate.Month = 7
HDate.Day = 15 + PDis
'-15-במידה והיום בחודש גדול מ
'אין חשיבות לסוג השנה
If HDate.Day > 0 Then
'עבור על רשימת החודשים עד אלול ומצא את התאריך העברי
If HDate.Day > 30 Then HDate.Month = 8: HDate.Day = HDate.Day - 30 'ניסן
If HDate.Day > 29 Then HDate.Month = 9: HDate.Day = HDate.Day - 29 'אייר
If HDate.Day > 30 Then HDate.Month = 10: HDate.Day = HDate.Day - 30 'סיוון
If HDate.Day > 29 Then HDate.Month = 11: HDate.Day = HDate.Day - 29 'תמוז
If HDate.Day > 30 Then HDate.Month = 12: HDate.Day = HDate.Day - 30 'אב
If HDate.Day > 29 Then HDate.Month = 13: HDate.Day = HDate.Day - 29 'אלול
Else
'יש לחשב את סוג השנה. באמצעות נוסחת
'גאוס נחשב את אורכה
'חישוב התאריך היוליאני בו חל ט"ו בניסן
'של השנה הקודמת
PPDate = GetPDate(HDate.Year - 1)
'אורך השנה העברית האחרונה הוא
LYL = PDate - PPDate
'עבור על רשימת החודשים בשנה מעוברת
' ובשנה לא מעוברת
'מספר הימים בכיסלו ובחשון
If LYL = 385 Or LYL = 355 Then HeshvanL = 30 'שנה שלמה
If LYL = 383 Or LYL = 353 Then KislevL = 29 'שנה חסרה
'מעבר לאורך החודשים
If LYL > 360 Then 'שנה מעוברת
'מספרו של אדר א' הוא 6.1
'מספרו של אדר ב' הוא 6.2
If HDate.Day < 1 Then HDate.Month = 6.2: HDate.Day = HDate.Day + 29 'אדר ב
If HDate.Day < 1 Then HDate.Month = 6.1: HDate.Day = HDate.Day + 30 'אדר א
Else 'שנה פשוטה
If HDate.Day < 1 Then HDate.Month = 6: HDate.Day = HDate.Day + 29 'אדר
End If
If HDate.Day < 1 Then HDate.Month = 5: HDate.Day = HDate.Day + 30 'שבט
If HDate.Day < 1 Then HDate.Month = 4: HDate.Day = HDate.Day + 29 'טבת
If HDate.Day < 1 Then HDate.Month = 3: HDate.Day = HDate.Day + KislevL 'כסלו
If HDate.Day < 1 Then HDate.Month = 2: HDate.Day = HDate.Day + HeshvanL 'חשוון
If HDate.Day < 1 Then HDate.Month = 1: HDate.Day = HDate.Day + 30 'תשרי
If HDate.Day < 1 Then HDate.Month = 0: HDate.Day = HDate.Day + 29
End If
'מציאת שמות היום, החודש והשנה
HDate.HDay = GetGimatrics(HDate.Day)
HDate.HMonth = GetMonthName(HDate.Month)
HDate.HYear = GetGimatrics(HDate.Year)
'בדוק אם יש חג החל באותו היום
HDate.Holiday = GetHoliday(HDate, GDate, KislevL)
GetHDate = HDate
End Function
'החזר את שם החג או המועד היהודי או העברי החל באותו היום
Function GetHoliday$(HDate As HDateType, ByVal GDate As Date, ByVal KislevL%)
'HDate 'התאריך העברי
'GDate 'התאריך הגרגוריאני
'(מספר הימים בחודש כסלו אותה השנה (לחישוב חנוכה
Dim CurWeekDay% 'היום בשבוע
Dim Holiday$
'חישוב היום בשבוע
CurWeekDay = WeekDay(GDate)
If HDate.Day = 1 And HDate.Month = 1 Then
Holiday = "ראש השנה א"
ElseIf HDate.Day = 2 And HDate.Month = 1 Then
Holiday = "ראש השנה ב"
ElseIf HDate.Day = 12 And HDate.Month = 1 Then
Holiday = "יום כיפור"
ElseIf HDate.Day = 15 And HDate.Month = 1 Then
Holiday = "סוכות א"
ElseIf HDate.Day >= 16 And HDate.Day <= 21 And HDate.Month = 1 Then
Holiday = "חהמ" + Chr$(34) + "ס"
ElseIf HDate.Day = 22 And HDate.Month = 1 Then
Holiday = "סוכות ב"
ElseIf Day(GDate) = 29 And Month(GDate) = 11 Then
Holiday = "כט בנובמבר"
ElseIf HDate.Month = 3 And HDate.Day >= 25 Then
Holiday = "חנוכה (" + Chr$(Asc("א") + HDate.Day - 25) + ")"
ElseIf HDate.Month = 4 And HDate.Day <= (32 - KislevL) Then
Holiday = "חנוכה (" + Chr$(Asc("ו") + HDate.Day + 30 - KislevL) + ")"
ElseIf HDate.Day = 15 And HDate.Month = 5 Then
Holiday = "טו בשבט"
ElseIf HDate.Day = 14 And (HDate.Month = 6 Or HDate.Month = 6.2) Then
Holiday = "פורים"
ElseIf HDate.Day = 15And (HDate.Month = 6 Or HDate.Month = 6.2) Then
Holiday = "שושן פורים"
ElseIf HDate.Day = 15 And HDate.Month = 7 Then
Holiday = "פסח"
ElseIf HDate.Day >= 16 And HDate.Day <= 21 And HDate.Month = 7 Then
Holiday = "חהמ" + Chr$(34) + "פ"
ElseIf HDate.Day = 22 And HDate.Month = 7 Then
Holiday = "פסח שני"
ElseIf HDate.Day = 15 And HDate.Month = 9 Then
Holiday = "שבועות"
ElseIf HDate.Day = 9 And HDate.Month = 11 Then
Holiday = "ט' באב"
End If
'חגים במועד לא קבוע
If HDate.Month = 7 Then 'בחודש ניסן
'יום השואה יחול במקרים הבאים: כז בניסן שאינו חמישי, שישי
'או שבת, כו בניסן שהוא יום רביעי או כח או כט בניסן שהם יום ראשון
If (HDate.Day = 27 And CurWeekDay < 5) Or (HDate.Day = 26 And CurWeekDay = 4) Or ((HDate.Day = 28 Or HDate.Day = 29) And CurWeekDay = 1) Then
Holiday = "יום השואה"
End If
ElseIf HDate.Month = 8 Then 'בחודש אייר
'יום העצמאות לא יחול בשישי, שבת או ראשון
'כלומר יחול במקרים הבאים: ה' באיר שאינו שישי שבת או ראשון
' ד' באייר שהוא יום חמישי או ו' או ז' באייר שהם יום ראשון
If (HDate.Day = 5 And CurWeekDay > 1 And CurWeekDay < 6) Or (HDate.Day = 4 And CurWeekDay = 5) Or ((HDate.Day = 6 Or HDate.Day = 7) And CurWeekDay = 2) Then
Holiday = "יום העצמאות"
End If
'יום הזיכרון יחול במקרים הבאים: ד באייר שאינו חמישי, שישי
'או שבת, ג באייר שהוא יום רביעי או ה או ו באייר שהם יום ראשון
If (HDate.Day = 4 And CurWeekDay < 5) Or (HDate.Day = 3 And CurWeekDay = 4) Or ((HDate.Day = 5 Or HDate.Day = 6) And CurWeekDay = 1) Then
Holiday = "יום הזיכרון"
End If
End If
GetHoliday = Holiday
End Function
'החזר את שם החודש העברי
Function GetMonthName$(ByVal Month)
Select Case Month
Case 1: GetMonthName$ = "תשרי"
Case 2: GetMonthName$ = "חשוון"
Case 3: GetMonthName$ = "כסלו"
Case 4: GetMonthName$ = "טבת"
Case 5: GetMonthName$ = "שבט"
Case 6: GetMonthName$ = "אדר"
Case 6.1: GetMonthName$ = "אדר א"
Case 6.2: GetMonthName$ = "אדר ב"
Case 7: GetMonthName$ = "ניסן"
Case 8: GetMonthName$ = "אייר"
Case 9: GetMonthName$ = "סיוון"
Case 10: GetMonthName$ = "תמוז"
Case 11: GetMonthName$ = "אב"
Case 12: GetMonthName$ = "אלול"
End Select
End Function
'החזר את התאריך היוליאני בו חל הפסח
'ל השנה העברית הנתונה
Function GetPDate(ByVal HYear%) As Date
Dim AA, MM, a, b, m, c 'משתנים לחישוב נוסחת גאוס
Dim PDate As Date
'חישוב התאריך היוליאני בו חל ט"ו בניסן לפי
'נוסחת גאוס
AA = HYear%
a = (12 * AA + 17) Mod 19
b = AA Mod 4
MM = Int(32.0441 + 1.55424 * a + 0.25 * b - 0.0031779 * AA)
m = (32.0441 + 1.55424 * a + 0.25 * b - 0.0031779 * AA) - MM
c = (MM + 3 * AA + 5 * b + 5) Mod 7
'תאריך הפסח הוא
PDate = DateSerial(AA - 3760, 3, MM)
'הדחיות
If c = 2 Or c = 4 Or c = 6 Then PDate = PDate + 1
If c = 1 And a > 6 And m >= 0.6329 Then PDate = PDate + 2
If c = 0 And a > 11 And m >= 0.8977 Then PDate = PDate + 1
GetPDate = PDate
End Function
'********************************************************************
'********************************************************************