Type=StaticCode Version=5.2 ModulesStructureVersion=1 B4A=true @EndOfDesignText@ 'Code module Sub Process_Globals 'http://www.b4x.com/android/forum/threads/dateconvert-library.16770/ 'Hebrew date types Type HebDateType (m_iDay As Int, m_iMonth As Int, m_iYear As Int, m_bLeapYear As Boolean, m_iMonthLength As Int) Private g_bInIsrael As Boolean = False Private g_bInJerusalem As Boolean = False Private g_DateConvert As DateConvert Private g_bInitilized As Boolean = False Public Const InIsrael_LIST() As String = Array As String ( _ "в Израиле", _ 'in Israel "Вне Израиля" _ 'Out of Israel ) Public Const InJerusalem_LIST() As String = Array As String ( _ "в Иерусалиме", _ 'in Jerusalem "Вне Иерусалима" _ 'Out of Jerusalem ) ' Private Const sMODULE_NAME As String = "HebrewCalendarUtils" Public Const MONTH_Tishrei As String = 1 Public Const MONTH_Cheshvan As String = 2 Public Const MONTH_Kislev As String = 3 Public Const MONTH_Tevet As String = 4 Public Const MONTH_Shevat As String = 5 Public Const MONTH_Adar_I As String = 6 Public Const MONTH_Adar_II As String = 7 Public Const MONTH_Adar As String = 7 Public Const MONTH_Nisan As String = 8 Public Const MONTH_Iyar As String = 9 Public Const MONTH_Sivan As String = 10 Public Const MONTH_Tammuz As String = 11 Public Const MONTH_Av As String = 12 Public Const MONTH_Elul As String = 13 End Sub '#BEG: Initialize/Finilize Subs Private Sub IsInitialized As Boolean Return g_bInitilized End Sub Public Sub Initialize(a_bInIsrael As Boolean, a_bInJerusalem As Boolean) '#BEG: Предотвращаем повторную инициализацию, так как Initialize может вызываться несколько раз из Activity_Create/Service_Create If Not (IsInitialized) Then g_bInIsrael = a_bInIsrael g_bInJerusalem = a_bInJerusalem g_bInitilized = True End If '#END: Предотвращаем повторную инициализацию, так как Initialize может вызываться несколько раз из Activity_Create/Service_Create End Sub Public Sub Finilize() '#BEG: Предотвращаем повторно Finilize, если Finilize будет вызываться из события по завершению всего процесса, которого пока не существут If IsInitialized Then g_bInJerusalem = False g_bInIsrael = False g_bInitilized = False End If '#END: Предотвращаем повторно Finilize, если Finilize будет вызываться из события по завершению всего процесса, которого пока не существут End Sub '#END: Initialize/Finilize Subs '#BEG: Accessor: DB Subs '#END: Accessor: DB Subs '#BEG: Accessor Subs Public Sub InIsrael() As Boolean Return g_bInIsrael End Sub Public Sub InJerusalem() As Boolean Return g_bInJerusalem End Sub '#END: Accessor Subs Public Sub Set_InIsrael(a_bValue As Boolean) g_bInIsrael = a_bValue End Sub Public Sub InIsrael_AsString() As String If g_bInIsrael Then Return InIsrael_LIST(0) Else Return InIsrael_LIST(1) End If End Sub Public Sub Set_InJerusalem(a_bValue As Boolean) g_bInJerusalem = a_bValue End Sub Public Sub InJerusalem_AsString() As String If g_bInJerusalem Then Return InJerusalem_LIST(0) Else Return InJerusalem_LIST(1) End If End Sub '#BEG: isHoliday_* Subs Public Sub isHoliday(a_HebDate As HebDateType) As Boolean If isHoliday_Rosh_Hashanah(a_HebDate) Then Return True If isHoliday_Yom_Kippur(a_HebDate) Then Return True If isHoliday_Sukkot(a_HebDate) Then Return True If isHoliday_Simchat_Torah(a_HebDate) Then Return True If isHoliday_Hanukkah(a_HebDate) Then Return True If isHoliday_Tu_BiShvat(a_HebDate) Then Return True If isHoliday_Purim(a_HebDate) Then Return True If isHoliday_Passover(a_HebDate) Then Return True If isHoliday_Lag_BaOmer(a_HebDate) Then Return True If isHoliday_Shavuot(a_HebDate) Then Return True Return False End Sub Public Sub isHolidayFromGregDate(a_GregDateTime As Long) As Boolean Return isHoliday(HebDateFromGregDate(a_GregDateTime)) End Sub Public Sub isSabbath(a_GregDateTime As Long) As Boolean ' Returns the day of week component from the ticks value. ' Values are between 1 To 7. Sunday To Saturday respectively Return DateTime.GetDayOfWeek(a_GregDateTime) = bDateTimeUtils.DayOfWeek_Saturday End Sub Public Sub isSabbathOrHoliday() As Boolean Dim l_liNow As Long = DateTime.Now Return isSabbath(l_liNow) Or isHolidayFromGregDate(l_liNow) ' Return isHoliday(l_liNow) End Sub Private Sub isHoliday_OnDays(a_HebDate As HebDateType, a_iDayFrom As Int, a_iDayTo As Int) As Boolean Return a_iDayFrom <= a_HebDate.m_iDay And a_HebDate.m_iDay <= a_iDayTo End Sub Private Sub isHoliday_OnMonthDays(a_HebDate As HebDateType, a_iMonth As Int, _ a_iDayFrom As Int, a_iDayTo_InIsrael As Int, a_iDayFrom_NotInIsrael As Int, a_iDayTo_NotInIsrael As Int) As Boolean If a_HebDate.m_iMonth = a_iMonth Then If InIsrael Then If isHoliday_OnDays(a_HebDate, a_iDayFrom, a_iDayTo_InIsrael) Then Return True Else If isHoliday_OnDays(a_HebDate, a_iDayFrom_NotInIsrael, a_iDayTo_NotInIsrael) Then Return True End If End If Return False End Sub Public Sub isHoliday_Rosh_Hashanah(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Rosh_Hashanah ' Start of first day of Tishrei ' End of second day of Tishrei Return isHoliday_OnMonthDays(a_HebDate, MONTH_Tishrei, 1, 2, 1, 2) End Sub Public Sub isHoliday_Yom_Kippur(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Yom_Kippur '10th day of Tishrei Return isHoliday_OnMonthDays(a_HebDate, MONTH_Tishrei, 1, 10, 1, 10) End Sub Public Sub isHoliday_Sukkot(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Sukkot '21st day of Tishrei (22nd outside of Israel) Return isHoliday_OnMonthDays(a_HebDate, MONTH_Tishrei, 15, 21, 15, 22) End Sub Public Sub isHoliday_Simchat_Torah(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Simchat_Torah '22nd (outside of Israel 23rd) day of Tishrei Return isHoliday_OnMonthDays(a_HebDate, MONTH_Tishrei, 22, 22, 23, 23) End Sub Public Sub isHoliday_Hanukkah(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Hanukkah 'Begins 25 Kislev '2 Tevet or 3 Tevet If a_HebDate.m_iMonth = MONTH_Kislev Then If isHoliday_OnDays(a_HebDate, 25, 30) Then Return True End If If a_HebDate.m_iMonth = MONTH_Tevet Then If a_HebDate.m_iMonthLength = 30 Then If isHoliday_OnDays(a_HebDate, 1, 2) Then Return True Else ' a_HebDate.m_iMonthLength = 29 If isHoliday_OnDays(a_HebDate, 1, 3) Then Return True End If End If Return False End Sub Public Sub isHoliday_Tu_BiShvat(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Tu_BiShvat '15th of Shvat Return isHoliday_OnMonthDays(a_HebDate, MONTH_Shevat, 15, 15, 15, 15) End Sub Public Sub isHoliday_Purim(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Purim '14th day of Adar (in Jerusalem and all ancient walled cities, 15th of Adar) ' MONTH_Adar_II или MONTH_Adar If InJerusalem Then Return isHoliday_OnMonthDays(a_HebDate, MONTH_Adar_II, 15, 15, 15, 15) Else Return isHoliday_OnMonthDays(a_HebDate, MONTH_Adar_II, 14, 14, 14, 14) End If End Sub Public Sub isHoliday_Passover(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Passover - 15 Nisan correct. 'https://ru.wikipedia.org/wiki/Passover - 14 Nisan incorrect. 'Begins 15th day of Nisan 'Ends 21st day of Nisan in Israel, and among some liberal Diaspora Jews; 22nd day of Nisan outside of Israel among more traditional Diaspora Jews.[3] Return isHoliday_OnMonthDays(a_HebDate, MONTH_Nisan, 15, 21, 15, 22) End Sub Public Sub isHoliday_Lag_BaOmer(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Lag_BaOmer '18th day of Iyar Return isHoliday_OnMonthDays(a_HebDate, MONTH_Iyar, 18, 18, 18, 18) End Sub Public Sub isHoliday_Shavuot(a_HebDate As HebDateType) As Boolean 'https://en.wikipedia.org/wiki/Shavuot '(Orach Chayim, 494). ' Begins the 6th day of Sivan (or the Sunday following the 6th day of Sivan in the Karaite tradition) ' Ends 7th (in Israel: 6th) day of Sivan Return isHoliday_OnMonthDays(a_HebDate, MONTH_Sivan, 6, 6, 6, 7) End Sub '#END: isHoliday_* Subs '#BEG: Hebrew*_DateConvert Subs Public Sub DayOfHebrewMonthFromGregDate(a_GregDateTime As Long) As Int Dim sHebDate As String = g_DateConvert.GregToHeb2(a_GregDateTime, False) ' HebDate format: d/m/yyyy 'извлечь DayOfHebrewMonth from sHebDate As String Dim iDayOfHebrewMonth As Int = sHebDate.SubString2(0, sHebDate.IndexOf("/")) Return iDayOfHebrewMonth End Sub Public Sub HebMonthLengthFromHebDate(a_HebDate As HebDateType) As Int Return g_DateConvert.HebMonthLength(a_HebDate.m_iMonth, a_HebDate.m_iYear) End Sub Public Sub HebMonthLengthFromGregDate(a_GregDateTime As Long) As Int 'извлечь HebrewMonth and HbrewYear from sHebDate As String Dim tHebDate As HebDateType = HebDateFromGregDate(a_GregDateTime) Return HebMonthLengthFromHebDate(tHebDate) End Sub Public Sub HebDateFromGregDate(a_GregDateTime As Long) As HebDateType Dim tHebDate As HebDateType Dim sHebDate As String = g_DateConvert.GregToHeb2(a_GregDateTime, False) ' HebDate format: d/m/yyyy 'извлечь HebrewDay, HebrewMonth and HebrewYear from sHebDate As String tHebDate.m_iDay = sHebDate.SubString2( _ 0, sHebDate.IndexOf("/")) tHebDate.m_iMonth = sHebDate.SubString2( _ sHebDate.IndexOf("/") + 1, sHebDate.LastIndexOf("/")) tHebDate.m_iYear = sHebDate.SubString2(sHebDate.LastIndexOf("/") + 1, _ sHebDate.Length) tHebDate.m_bLeapYear = g_DateConvert.IsLeapH(tHebDate.m_iYear) tHebDate.m_iMonthLength = HebMonthLengthFromHebDate(tHebDate) Return tHebDate End Sub Public Sub HebMonthStringFromHebDate(a_HebDateTime As HebDateType) As String Dim sHebMonth As String = "-" Select a_HebDateTime.m_iMonth Case MONTH_Tishrei sHebMonth = "Тишрей" Case MONTH_Cheshvan sHebMonth = "Хешван" Case MONTH_Kislev sHebMonth = "Кислев" Case MONTH_Tevet sHebMonth = "Тевет" Case MONTH_Shevat sHebMonth = "Шват" Case MONTH_Adar_I sHebMonth = "Адар I" Case MONTH_Adar_II, MONTH_Adar ' The numbers of Adar I and Adar II are 6 and 7 in a leap year. ' In regular year they are both named Adar, use 7. If a_HebDateTime.m_bLeapYear Then sHebMonth = "Адар II" Else sHebMonth = "Адар" End If Case MONTH_Nisan sHebMonth = "Нисан" Case MONTH_Iyar sHebMonth = "Ияр" Case MONTH_Sivan sHebMonth = "Сиван" Case MONTH_Tammuz sHebMonth = "Таммуз" Case MONTH_Av sHebMonth = "Ав" Case MONTH_Elul sHebMonth = "Элул" End Select Return sHebMonth End Sub Public Sub HebDateStringFromGregDate(a_GregDateTime As Long) As String 'Dim sHebDate As String = m_DateConvert.GregToHeb2(a_GregDateTime, True) ' HebDate in Hebrew Dim tHebDate As HebDateType = HebDateFromGregDate(a_GregDateTime) Dim sHebDate As String = tHebDate.m_iDay & " " & HebMonthStringFromHebDate(tHebDate) & " " &tHebDate.m_iYear Return sHebDate End Sub '#END: Hebrew*_DateConvert Subs