@@ -664,6 +664,50 @@ public long getShaahZmanis96MinutesZmanis() {
664664 public long getShaahZmanisAteretTorah () {
665665 return getTemporalHour (getAlos72Zmanis (), getTzaisAteretTorah ());
666666 }
667+
668+ /**
669+ * Method to return a <em>shaah zmanis</em> (temporal hour) used by some <em>zmanim</em> according to the opinion of
670+ * <a href="https://en.wikipedia.org/wiki/Yaakov_Moshe_Hillel">Rabbi Yaakov Moshe Hillel</a> as published in the
671+ * <em>luach</em> of the Bais Horaah of Yeshivat Chevrat Ahavat Shalom that is based on a day starting 72 minutes before
672+ * sunrise in degrees {@link #getAlos16Point1Degrees() <em>alos</em> 16.1°} and ending 14 minutes after sunset in
673+ * degrees {@link #getTzaisGeonim3Point8Degrees() <em>tzais</em> 3.8°}. This day is split into 12 equal parts with
674+ * each part being a <em>shaah zmanis</em>. Note that with this system, <em>chatzos</em> (mid-day) will not be the point
675+ * that the sun is {@link #getSunTransit() halfway across the sky}. These <em>shaos zmaniyos</em> are used for <em>Mincha
676+ * Ketana</em> and <em>Plag Hamincha</em>. The 14 minutes are based on 3/4 of an 18 minute <em>mil</em>, with half a minute
677+ * added for Rav Yosi.
678+ *
679+ * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
680+ * such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
681+ * where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
682+ * {@link AstronomicalCalendar} documentation.
683+ *
684+ * @see #getMinchaKetanaAhavatShalom()
685+ * @see #getPlagAhavatShalom()
686+ */
687+ public long getShaahZmanisAlos16Point1ToTzais3Point8 () {
688+ return getTemporalHour (getAlos16Point1Degrees (), getTzaisGeonim3Point8Degrees ());
689+ }
690+
691+ /**
692+ * Method to return a <em>shaah zmanis</em> (temporal hour) used by some <em>zmanim</em> according to the opinion of
693+ * <a href="https://en.wikipedia.org/wiki/Yaakov_Moshe_Hillel">Rabbi Yaakov Moshe Hillel</a> as published in the
694+ * <em>luach</em> of the Bais Horaah of Yeshivat Chevrat Ahavat Shalom that is based on a day starting 72 minutes before
695+ * sunrise in degrees {@link #getAlos16Point1Degrees() <em>alos</em> 16.1°} and ending 13.5 minutes after sunset in
696+ * degrees {@link #getTzaisGeonim3Point7Degrees() <em>tzais</em> 3.7°}. This day is split into 12 equal parts with
697+ * each part being a <em>shaah zmanis</em>. Note that with this system, <em>chatzos</em> (mid-day) will not be the point
698+ * that the sun is {@link #getSunTransit() halfway across the sky}. These <em>shaos zmaniyos</em> are used for <em>Mincha
699+ * Gedola</em> calculation.
700+ *
701+ * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
702+ * such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
703+ * where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
704+ * {@link AstronomicalCalendar} documentation.
705+ *
706+ * @see #getMinchaGedolaAhavatShalom()
707+ */
708+ public long getShaahZmanisAlos16Point1ToTzais3Point7 () {
709+ return getTemporalHour (getAlos16Point1Degrees (), getTzaisGeonim3Point7Degrees ());
710+ }
667711
668712 /**
669713 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a dip of 96 minutes. This calculation
@@ -1766,6 +1810,37 @@ public Date getMinchaGedola72Minutes() {
17661810 public Date getMinchaGedola16Point1Degrees () {
17671811 return getMinchaGedola (getAlos16Point1Degrees (), getTzais16Point1Degrees ());
17681812 }
1813+
1814+ /**
1815+ * This method returns the time of <em>mincha gedola</em> based on the opinion of <a href=
1816+ * "https://en.wikipedia.org/wiki/Yaakov_Moshe_Hillel">Rabbi Yaakov Moshe Hillel</a> as published in the <em>luach</em>
1817+ * of the Bais Horaah of Yeshivat Chevrat Ahavat Shalom that <em>mincha gedola</em> is calculated as half a <em>shaah
1818+ * zmanis</em> after <em>chatzos</em> with <em>shaos zmaniyos</em> calculated based on a day starting 72 minutes befoe sunrise
1819+ * {@link #getAlos16Point1Degrees() <em>alos</em> 16.1°} and ending 13.5 minutes after sunset {@link
1820+ * #getTzaisGeonim3Point7Degrees() <em>tzais</em> 3.7°}. <em>Mincha gedola</em> is the earliest time to pray <em>mincha</em>.
1821+ * The later of this time or 30 clock minutes after <em>chatzos</em> is returned. See {@link #getMinchaGedolaGreaterThan30()}
1822+ * (though that calculation is based on <em>mincha gedola</em> GRA).
1823+ * For more information about <em>mincha gedola</em> see the documentation on {@link #getMinchaGedola() <em>mincha gedola</em>}.
1824+ *
1825+ * @return the <code>Date</code> of the <em>mincha gedola</em>. If the calculation can't be computed such as northern and
1826+ * southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not
1827+ * reach low enough below the horizon for this calculation, a null will be returned. See detailed explanation
1828+ * on top of the {@link AstronomicalCalendar} documentation.
1829+ *
1830+ * @see #getAlos16Point1Degrees()
1831+ * @see #getTzaisGeonim3Point7Degrees()
1832+ * @see #getShaahZmanisAlos16Point1ToTzais3Point7()
1833+ * @see #getMinchaGedolaGreaterThan30()
1834+ */
1835+ public Date getMinchaGedolaAhavatShalom () {
1836+
1837+ if (getMinchaGedola30Minutes () == null || getMinchaGedola () == null ) {
1838+ return null ;
1839+ } else {
1840+ return getMinchaGedola30Minutes ().compareTo (getTimeOffset (getChatzos (), getShaahZmanisAlos16Point1ToTzais3Point7 () / 2 )) > 0 ?
1841+ getMinchaGedola30Minutes () : getTimeOffset (getChatzos (), getShaahZmanisAlos16Point1ToTzais3Point7 () / 2 );
1842+ }
1843+ }
17691844
17701845 /**
17711846 * This is a convenience method that returns the later of {@link #getMinchaGedola()} and
@@ -1806,6 +1881,29 @@ public Date getMinchaGedolaGreaterThan30() {
18061881 public Date getMinchaKetana16Point1Degrees () {
18071882 return getMinchaKetana (getAlos16Point1Degrees (), getTzais16Point1Degrees ());
18081883 }
1884+
1885+ /**
1886+ * This method returns the time of <em>mincha ketana</em> based on the opinion of <a href=
1887+ * "https://en.wikipedia.org/wiki/Yaakov_Moshe_Hillel">Rabbi Yaakov Moshe Hillel</a> as published in the <em>luach</em>
1888+ * of the Bais Horaah of Yeshivat Chevrat Ahavat Shalom that <em>mincha ketana</em> is calculated as 2.5 <em>shaos
1889+ * zmaniyos</em> before {@link #getTzaisGeonim3Point8Degrees() <em>tzais</em> 3.8°} with <em>shaos zmaniyos</em>
1890+ * calculated based on a day starting at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1°} and ending at
1891+ * <em>tzais</em> 3.8°. <em>Mincha ketana</em> is the preferred earliest time to pray <em>mincha</em> according to
1892+ * the opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> and others. For more information
1893+ * on this see the documentation on {@link #getMinchaKetana() <em>mincha ketana</em>}.
1894+ *
1895+ * @return the the <code>Date</code> of the time of <em>mincha ketana</em>. If the calculation can't be computed such as northern
1896+ * and southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not
1897+ * reach low enough below the horizon for this calculation, a null will be returned. See detailed explanation
1898+ * on top of the {@link AstronomicalCalendar} documentation.
1899+ *
1900+ * @see #getShaahZmanisAlos16Point1ToTzais3Point8()
1901+ * @see #getMinchaGedolaAhavatShalom()
1902+ * @see #getPlagAhavatShalom()
1903+ */
1904+ public Date getMinchaKetanaAhavatShalom () {
1905+ return getTimeOffset (getTzaisGeonim3Point8Degrees (), -getShaahZmanisAlos16Point1ToTzais3Point8 () * 2.5 );
1906+ }
18091907
18101908 /**
18111909 * This method returns the time of <em>mincha ketana</em> according to the Magen Avraham with the day
@@ -2118,6 +2216,27 @@ public Date getPlagAlosToSunset() {
21182216 public Date getPlagAlos16Point1ToTzaisGeonim7Point083Degrees () {
21192217 return getPlagHamincha (getAlos16Point1Degrees (), getTzaisGeonim7Point083Degrees ());
21202218 }
2219+
2220+ /**
2221+ * This method returns the time of <em>plag hamincha</em> (the earliest time that Shabbos can be started) based on the
2222+ * opinion of <a href="https://en.wikipedia.org/wiki/Yaakov_Moshe_Hillel">Rabbi Yaakov Moshe Hillel</a> as published in
2223+ * the <em>luach</em> of the Bais Horaah of Yeshivat Chevrat Ahavat Shalom that that <em>plag hamincha</em> is calculated
2224+ * as 1.25 <em>shaos zmaniyos</em> before {@link #getTzaisGeonim3Point8Degrees() <em>tzais</em> 3.8°} with <em>shaos
2225+ * zmaniyos</em> calculated based on a day starting at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1°} and
2226+ * ending at <em>tzais</em> 3.8°.
2227+ *
2228+ * @return the <code>Date</code> of the <em>plag</em>. If the calculation can't be computed such as northern and
2229+ * southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not
2230+ * reach low enough below the horizon for this calculation, a null will be returned. See detailed explanation
2231+ * on top of the {@link AstronomicalCalendar} documentation.
2232+ *
2233+ * @see #getShaahZmanisAlos16Point1ToTzais3Point8()
2234+ * @see #getMinchaGedolaAhavatShalom()
2235+ * @see #getMinchaKetanaAhavatShalom()
2236+ */
2237+ public Date getPlagAhavatShalom () {
2238+ return getTimeOffset (getTzaisGeonim3Point8Degrees (), -getShaahZmanisAlos16Point1ToTzais3Point8 () * 1.25 );
2239+ }
21212240
21222241 /**
21232242 * Method to return the beginning of <em>bain hashmashos</em> of Rabbeinu Tam calculated when the sun is
@@ -2848,7 +2967,7 @@ private Date getZmanisBasedOffset(double hours) {
28482967 return null ;
28492968 }
28502969
2851- if (hours > 0 ) {
2970+ if (hours > 0 ) {
28522971 return getTimeOffset (getElevationAdjustedSunset (), (long ) (shaahZmanis * hours ));
28532972 } else {
28542973 return getTimeOffset (getElevationAdjustedSunrise (), (long ) (shaahZmanis * hours ));
@@ -3153,7 +3272,7 @@ public Date getSofZmanKidushLevanaBetweenMoldos(Date alos, Date tzais) {
31533272 // Polynesia on Dec 2027 when kiddush Levana 3 days can be said on <em>Rosh Chodesh</em>, the sof zman Kiddush Levana
31543273 // will be on the 12th of the Teves. In the case of Anadyr, Russia on Jan, 2071, sof zman Kiddush Levana between the
31553274 // moldos will occur is on the night of 17th of Shevat. See Rabbi Dovid Heber's Shaarei Zmanim chapter 4 (pages 28 and 32).
3156- if (jewishCalendar .getJewishDayOfMonth () < 11 || jewishCalendar .getJewishDayOfMonth () > 16 ) {
3275+ if (jewishCalendar .getJewishDayOfMonth () < 11 || jewishCalendar .getJewishDayOfMonth () > 16 ) {
31573276 return null ;
31583277 }
31593278 return getMoladBasedTime (jewishCalendar .getSofZmanKidushLevanaBetweenMoldos (), alos , tzais , false );
@@ -3181,9 +3300,9 @@ public Date getSofZmanKidushLevanaBetweenMoldos(Date alos, Date tzais) {
31813300 private Date getMoladBasedTime (Date moladBasedTime , Date alos , Date tzais , boolean techila ) {
31823301 Date lastMidnight = getMidnightLastNight ();
31833302 Date midnightTonigh = getMidnightTonight ();
3184- if (!(moladBasedTime .before (lastMidnight ) || moladBasedTime .after (midnightTonigh ))){
3185- if (alos != null || tzais != null ) {
3186- if (techila && !(moladBasedTime .before (tzais ) || moladBasedTime .after (alos ))){
3303+ if (!(moladBasedTime .before (lastMidnight ) || moladBasedTime .after (midnightTonigh ))){
3304+ if (alos != null || tzais != null ) {
3305+ if (techila && !(moladBasedTime .before (tzais ) || moladBasedTime .after (alos ))){
31873306 return tzais ;
31883307 } else {
31893308 return alos ;
@@ -3247,7 +3366,7 @@ public Date getSofZmanKidushLevana15Days(Date alos, Date tzais) {
32473366 // French Polynesia on Dec 2027 when kiddush Levana 3 days can be said on <em>Rosh Chodesh</em>, the sof zman Kiddush
32483367 // Levana will be on the 12th of the Teves. in the case of Anadyr, Russia on Jan, 2071, sof zman kiddush levana will
32493368 // occur after midnight on the 17th of Shevat. See Rabbi Dovid Heber's Shaarei Zmanim chapter 4 (pages 28 and 32).
3250- if (jewishCalendar .getJewishDayOfMonth () < 11 || jewishCalendar .getJewishDayOfMonth () > 17 ) {
3369+ if (jewishCalendar .getJewishDayOfMonth () < 11 || jewishCalendar .getJewishDayOfMonth () > 17 ) {
32513370 return null ;
32523371 }
32533372 return getMoladBasedTime (jewishCalendar .getSofZmanKidushLevana15Days (), alos , tzais , false );
@@ -3323,15 +3442,15 @@ public Date getTchilasZmanKidushLevana3Days(Date alos, Date tzais) {
33233442 // of the 30th, the second night of Rosh Chodesh. The 3rd day after the <em>molad</em> will be on the 4th of the month.
33243443 // In the case of Anadyr, Russia on Jan, 2071, when sof zman kiddush levana is on the 17th of the month, the 3rd day
33253444 // from the molad will be on the 5th day of Shevat. See Rabbi Dovid Heber's Shaarei Zmanim chapter 4 (pages 28 and 32).
3326- if (jewishCalendar .getJewishDayOfMonth () > 5 && jewishCalendar .getJewishDayOfMonth () < 30 ) {
3445+ if (jewishCalendar .getJewishDayOfMonth () > 5 && jewishCalendar .getJewishDayOfMonth () < 30 ) {
33273446 return null ;
33283447 }
33293448
33303449 Date zman = getMoladBasedTime (jewishCalendar .getTchilasZmanKidushLevana3Days (), alos , tzais , true );
33313450
33323451 //Get the following month's zman kiddush Levana for the extreme case of Rapa Iti in French Polynesia on Dec 2027 when
33333452 // kiddush Levana can be said on Rosh Chodesh (the evening of the 30th). See Rabbi Dovid Heber's Shaarei Zmanim chapter 4 (page 32)
3334- if (zman == null && jewishCalendar .getJewishDayOfMonth () == 30 ) {
3453+ if (zman == null && jewishCalendar .getJewishDayOfMonth () == 30 ) {
33353454 jewishCalendar .forward (Calendar .MONTH , 1 );
33363455 zman = getMoladBasedTime (jewishCalendar .getTchilasZmanKidushLevana3Days (), null , null , true );
33373456 }
@@ -3358,13 +3477,13 @@ public Date getZmanMolad() {
33583477 // Optimize to not calculate for impossible dates, but account for extreme cases. The molad in the extreme case of Rapa
33593478 // Iti in French Polynesia on Dec 2027 occurs on the night of the 27th of Kislev. In the case of Anadyr, Russia on
33603479 // Jan 2071, the molad will be on the 2nd day of Shevat. See Rabbi Dovid Heber's Shaarei Zmanim chapter 4 (pages 28 and 32).
3361- if (jewishCalendar .getJewishDayOfMonth () > 2 && jewishCalendar .getJewishDayOfMonth () < 27 ) {
3480+ if (jewishCalendar .getJewishDayOfMonth () > 2 && jewishCalendar .getJewishDayOfMonth () < 27 ) {
33623481 return null ;
33633482 }
33643483 Date molad = getMoladBasedTime (jewishCalendar .getMoladAsDate (), null , null , true );
33653484
33663485 // deal with molad that happens on the end of the previous month
3367- if (molad == null && jewishCalendar .getJewishDayOfMonth () > 26 ) {
3486+ if (molad == null && jewishCalendar .getJewishDayOfMonth () > 26 ) {
33683487 jewishCalendar .forward (Calendar .MONTH , 1 );
33693488 molad = getMoladBasedTime (jewishCalendar .getMoladAsDate (), null , null , true );
33703489 }
@@ -3432,7 +3551,7 @@ public Date getTchilasZmanKidushLevana7Days(Date alos, Date tzais) {
34323551 // of the 30th, the second night of Rosh Chodesh), the 7th day after the molad will be on the 4th of the month.
34333552 // In the case of Anadyr, Russia on Jan, 2071, when sof zman kiddush levana is on the 17th of the month, the 7th day
34343553 // from the molad will be on the 9th day of Shevat. See Rabbi Dovid Heber's Shaarei Zmanim chapter 4 (pages 28 and 32).
3435- if (jewishCalendar .getJewishDayOfMonth () < 4 || jewishCalendar .getJewishDayOfMonth () > 9 ) {
3554+ if (jewishCalendar .getJewishDayOfMonth () < 4 || jewishCalendar .getJewishDayOfMonth () > 9 ) {
34363555 return null ;
34373556 }
34383557
0 commit comments