Skip to content

Commit 67cffe9

Browse files
authored
Add some Luach Ahavat Shalom Zmanim
Added Mincha Gedola, Mincha Ketana and Plag Hamincha as calculated by Rabbi Yaakov Moshe Hillel's Luach Ahavat Shalom. A special thanks to Rabbi Daniel Aaron Glauberman who computed the actual times used in the Luach and was able to clarify details about the calculations. Rabbi Glauberman's calculations used in the actual luach uses more accurate refraction values (ray traced based on actual average monthly weather measurements where available), solar radius (has a range that has a total of 3 to 4 second range based on the actual radius of the sun on a given day, and not a yearly average) and other accuracy tweaks that are not at this point included in this library (for example the high accuracy Jean Meeus algorithm that is about 3 seconds more accurate). Also includes some minor whitespace tweaks as suggested by @Elyahu41 in #182.
1 parent 54a4823 commit 67cffe9

File tree

1 file changed

+130
-11
lines changed

1 file changed

+130
-11
lines changed

src/main/java/com/kosherjava/zmanim/ComplexZmanimCalendar.java

Lines changed: 130 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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&deg;} and ending 14 minutes after sunset in
673+
* degrees {@link #getTzaisGeonim3Point8Degrees() <em>tzais</em> 3.8&deg;}. 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&deg;} and ending 13.5 minutes after sunset in
696+
* degrees {@link #getTzaisGeonim3Point7Degrees() <em>tzais</em> 3.7&deg;}. 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&deg;} and ending 13.5 minutes after sunset {@link
1820+
* #getTzaisGeonim3Point7Degrees() <em>tzais</em> 3.7&deg;}. <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&deg;} with <em>shaos zmaniyos</em>
1890+
* calculated based on a day starting at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and ending at
1891+
* <em>tzais</em> 3.8&deg;. <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&deg;} with <em>shaos
2225+
* zmaniyos</em> calculated based on a day starting at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and
2226+
* ending at <em>tzais</em> 3.8&deg;.
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

Comments
 (0)