001/*
002 * Zmanim Java API
003 * Copyright (C) 2004-2022 Eliyahu Hershfeld
004 *
005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
006 * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
007 * any later version.
008 *
009 * This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied
010 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
011 * details.
012 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
013 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA,
014 * or connect to: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
015 */
016package com.kosherjava.zmanim;
017
018import java.util.Calendar;
019import java.util.Date;
020import com.kosherjava.zmanim.util.AstronomicalCalculator;
021import com.kosherjava.zmanim.util.GeoLocation;
022import com.kosherjava.zmanim.hebrewcalendar.JewishCalendar;
023
024/**
025 * <p>This class extends ZmanimCalendar and provides many more <em>zmanim</em> than available in the ZmanimCalendar. The basis
026 * for most <em>zmanim</em> in this class are from the <em>sefer</em> <b><a href="https://hebrewbooks.org/9765">Yisroel
027 * Vehazmanim</a></b> by <b><a href="https://en.wikipedia.org/wiki/Yisroel_Dovid_Harfenes">Rabbi Yisrael Dovid Harfenes</a></b>.
028 * As an example of the number of different <em>zmanim</em> made available by this class, there are methods to return 18
029 * different calculations for <em>alos</em> (dawn), 18 for <em>plag hamincha</em> and 29 for <em>tzais</em> available in this
030 * API. The real power of this API is the ease in calculating <em>zmanim</em> that are not part of the library. The methods for
031 * <em>zmanim</em> calculations not present in this class or it's superclass  {@link ZmanimCalendar} are contained in the
032 * {@link AstronomicalCalendar}, the base class of the calendars in our API since they are generic methods for calculating
033 * time based on degrees or time before or after {@link #getSunrise sunrise} and {@link #getSunset sunset} and are of interest
034 * for calculation beyond <em>zmanim</em> calculations. Here are some examples.
035 * <p>First create the Calendar for the location you would like to calculate:
036 * 
037 * <pre style="background: #FEF0C9; display: inline-block;">
038 * String locationName = &quot;Lakewood, NJ&quot;;
039 * double latitude = 40.0828; // Lakewood, NJ
040 * double longitude = -74.2094; // Lakewood, NJ
041 * double elevation = 20; // optional elevation correction in Meters
042 * // the String parameter in getTimeZone() has to be a valid timezone listed in
043 * // {@link java.util.TimeZone#getAvailableIDs()}
044 * TimeZone timeZone = TimeZone.getTimeZone(&quot;America/New_York&quot;);
045 * GeoLocation location = new GeoLocation(locationName, latitude, longitude, elevation, timeZone);
046 * ComplexZmanimCalendar czc = new ComplexZmanimCalendar(location);
047 * // Optionally set the date or it will default to today's date
048 * czc.getCalendar().set(Calendar.MONTH, Calendar.FEBRUARY);
049 * czc.getCalendar().set(Calendar.DAY_OF_MONTH, 8);</pre>
050 * <p>
051 * <b>Note:</b> For locations such as Israel where the beginning and end of daylight savings time can fluctuate from
052 * year to year, if your version of Java does not have an <a href=
053 * "https://www.oracle.com/java/technologies/tzdata-versions.html">up to date timezone database</a>, create a
054 * {@link java.util.SimpleTimeZone} with the known start and end of DST.
055 * To get <em>alos</em> calculated as 14&deg; below the horizon (as calculated in the calendars published in Montreal),
056 * add {@link AstronomicalCalendar#GEOMETRIC_ZENITH} (90) to the 14&deg; offset to get the desired time:
057 * <br><br>
058 * <pre style="background: #FEF0C9; display: inline-block;">
059 *  Date alos14 = czc.getSunriseOffsetByDegrees({@link AstronomicalCalendar#GEOMETRIC_ZENITH} + 14);</pre>
060 * <p>
061 * To get <em>mincha gedola</em> calculated based on the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern"
062 * >Magen Avraham (MGA)</a> using a <em>shaah zmanis</em> based on the day starting
063 * 16.1&deg; below the horizon (and ending 16.1&deg; after sunset) the following calculation can be used:
064 * 
065 * <pre style="background: #FEF0C9; display: inline-block;">
066 * Date minchaGedola = czc.getTimeOffset(czc.getAlos16point1Degrees(), czc.getShaahZmanis16Point1Degrees() * 6.5);</pre>
067 * <p>
068 * or even simpler using the included convenience methods
069 * <pre style="background: #FEF0C9; display: inline-block;">
070 * Date minchaGedola = czc.getMinchaGedola(czc.getAlos16point1Degrees(), czc.getShaahZmanis16Point1Degrees());</pre>
071 * <p>
072 * A little more complex example would be calculating <em>zmanim</em> that rely on a <em>shaah zmanis</em> that is
073 * not present in this library. While a drop more complex, it is still rather easy. An example would be to calculate
074 * the <a href="https://en.wikipedia.org/wiki/Israel_Isserlein">Trumas Hadeshen</a>'s <em>alos</em> to
075 * <em>tzais</em> based <em>plag hamincha</em> as calculated in the Machzikei Hadass calendar in Manchester, England.
076 * A number of this calendar's <em>zmanim</em> are calculated based on a day starting at <em>alos</em> of 12&deg; before
077 * sunrise and ending at <em>tzais</em> of 7.083&deg; after sunset. Be aware that since the <em>alos</em> and <em>tzais</em>
078 * do not use identical degree based offsets, this leads to <em>chatzos</em> being at a time other than the
079 * {@link #getSunTransit() solar transit} (solar midday). To calculate this <em>zman</em>, use the following steps. Note
080 * that <em>plag hamincha</em> is 10.75 hours after the start of the day, and the following steps are all that it takes.
081 * <br>
082 * <pre style="background: #FEF0C9; display: inline-block;">
083 * Date plag = czc.getPlagHamincha(czc.getSunriseOffsetByDegrees({@link AstronomicalCalendar#GEOMETRIC_ZENITH} + 12),
084 *                              czc.getSunsetOffsetByDegrees({@link AstronomicalCalendar#GEOMETRIC_ZENITH} + ZENITH_7_POINT_083));</pre>
085 * <p>
086 * Something a drop more challenging, but still simple, would be calculating a <em>zman</em> using the same "complex"
087 * offset day used in the above mentioned Manchester calendar, but for a <em>shaos zmaniyos</em> based <em>zman</em> not
088 * supported by this library, such as calculating the point that one should be <em>makpid</em>
089 * not to eat on <em>erev Shabbos</em> or <em>erev Yom Tov</em>. This is 9 <em>shaos zmaniyos</em> into the day.
090 * <ol>
091 *      <li>Calculate the <em>shaah zmanis</em> in milliseconds for this day</li>
092 *      <li>Add 9 of these <em>shaos zmaniyos</em> to <em>alos</em> starting at 12&deg;</li>
093 * </ol>
094 * <br>
095 * <pre style="background: #FEF0C9; display: inline-block;">
096 * long shaahZmanis = czc.getTemporalHour(czc.getSunriseOffsetByDegrees({@link AstronomicalCalendar#GEOMETRIC_ZENITH} + 12),
097 *                                              czc.getSunsetOffsetByDegrees({@link AstronomicalCalendar#GEOMETRIC_ZENITH} + ZENITH_7_POINT_083));
098 * Date sofZmanAchila = getTimeOffset(czc.getSunriseOffsetByDegrees({@link AstronomicalCalendar#GEOMETRIC_ZENITH} + 12),
099 *                                      shaahZmanis * 9);</pre>
100 * <p>
101 * Calculating this <em>sof zman achila</em> according to the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a>
102 * is simplicity itself.
103 * <pre style="background: #FEF0C9; display: inline-block;">
104 * Date sofZamnAchila = czc.getTimeOffset(czc.getSunrise(), czc.getShaahZmanisGra() * 9);</pre>
105 * 
106 * <h2>Documentation from the {@link ZmanimCalendar} parent class</h2>
107 * {@inheritDoc}
108 * 
109 * @author &copy; Eliyahu Hershfeld 2004 - 2022
110 */
111public class ComplexZmanimCalendar extends ZmanimCalendar {
112
113        /**
114         * The zenith of 3.7&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
115         * calculating <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> that <em>tzais</em> is the
116         * time it takes to walk 3/4 of a <em>Mil</em> at 18 minutes a <em>Mil</em>, or 13.5 minutes after sunset. The sun
117         * is 3.7&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} at this time in Jerusalem <a href=
118         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>.
119         * 
120         * @see #getTzaisGeonim3Point7Degrees()
121         */
122        protected static final double ZENITH_3_POINT_7 = GEOMETRIC_ZENITH + 3.7;
123
124        /**
125         * The zenith of 3.8&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
126         * calculating <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> that <em>tzais</em> is the
127         * time it takes to walk 3/4 of a <em>Mil</em> at 18 minutes a <em>Mil</em>, or 13.5 minutes after sunset. The sun
128         * is 3.8&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} at this time in Jerusalem <a href=
129         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>.
130         * 
131         * @see #getTzaisGeonim3Point8Degrees()
132         */
133        protected static final double ZENITH_3_POINT_8 = GEOMETRIC_ZENITH + 3.8;
134
135        /**
136         * The zenith of 5.95&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
137         * calculating <em>tzais</em> (nightfall) according to some opinions. This calculation is based on the position of
138         * the sun 24 minutes after sunset in Jerusalem <a href=
139         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
140         * which calculates to 5.95&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
141         * 
142         * @see #getTzaisGeonim5Point95Degrees()
143         */
144        protected static final double ZENITH_5_POINT_95 = GEOMETRIC_ZENITH + 5.95;
145
146        /**
147         * The zenith of 7.083&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This is often referred to as
148         * 7&deg;5' or 7&deg; and 5 minutes. This calculation is used for calculating <em>alos</em> (dawn) and
149         * <em>tzais</em> (nightfall) according to some opinions. This calculation is based on observation of 3 medium sized
150         * stars by Dr. Baruch Cohen in his calendar published in in 1899 in Strasbourg, France. This calculates to
151         * 7.0833333&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}. The <a href="https://hebrewbooks.org/1053">Sh"Ut
152         * Melamed Leho'il</a> in Orach Chaim 30 agreed to this <em>zman</em>, as did the Sh"Ut Bnei Tziyon, Tenuvas Sadeh and
153         * it is very close to the time of the <a href="https://hebrewbooks.org/22044">Mekor Chesed</a> of the Sefer chasidim.
154         * It is close to the position of the sun 30 minutes after sunset in Jerusalem <a href=
155         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, but not
156         * Exactly. The actual position of the sun 30 minutes after sunset in Jerusalem at the equilux is 7.205&deg; and
157         * 7.199&deg; at the equinox. See Hazmanim Bahalacha vol 2, pages 520-521 for details.
158         * @todo Hyperlink the proper sources.
159         * 
160         * @see #getTzaisGeonim7Point083Degrees()
161         * @see #getBainHasmashosRT13Point5MinutesBefore7Point083Degrees()
162         */
163        protected static final double ZENITH_7_POINT_083 = GEOMETRIC_ZENITH + 7 + (5.0 / 60);
164
165        /**
166         * The zenith of 10.2&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
167         * calculating <em>misheyakir</em> according to some opinions. This calculation is based on the position of the sun
168         * 45 minutes before {@link #getSunrise sunrise} in Jerusalem <a href=
169         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> which
170         * calculates to 10.2&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
171         * 
172         * @see #getMisheyakir10Point2Degrees()
173         */
174        protected static final double ZENITH_10_POINT_2 = GEOMETRIC_ZENITH + 10.2;
175
176        /**
177         * The zenith of 11&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
178         * calculating <em>misheyakir</em> according to some opinions. This calculation is based on the position of the sun
179         * 48 minutes before {@link #getSunrise sunrise} in Jerusalem <a href=
180         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
181         * calculates to 11&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
182         * 
183         * @see #getMisheyakir11Degrees()
184         */
185        protected static final double ZENITH_11_DEGREES = GEOMETRIC_ZENITH + 11;
186
187        /**
188         * The zenith of 11.5&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
189         * calculating <em>misheyakir</em> according to some opinions. This calculation is based on the position of the sun
190         * 52 minutes before {@link #getSunrise sunrise} in Jerusalem <a href=
191         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
192         * calculates to 11.5&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
193         * 
194         * @see #getMisheyakir11Point5Degrees()
195         */
196        protected static final double ZENITH_11_POINT_5 = GEOMETRIC_ZENITH + 11.5;
197
198        /**
199         * The zenith of 13.24&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
200         * calculating Rabbeinu Tam's <em>bain hashmashos</em> according to some opinions.
201         * NOTE: See comments on {@link #getBainHasmashosRT13Point24Degrees} for additional details about the degrees.
202         * 
203         * @see #getBainHasmashosRT13Point24Degrees
204         * 
205         */
206        protected static final double ZENITH_13_POINT_24 = GEOMETRIC_ZENITH + 13.24;
207        
208        /**
209         * The zenith of 19&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
210         * calculating <em>alos</em> according to some opinions.
211         * 
212         * @see #getAlos19Degrees()
213         * @see #ZENITH_19_POINT_8
214         */
215        protected static final double ZENITH_19_DEGREES = GEOMETRIC_ZENITH + 19;
216
217        /**
218         * The zenith of 19.8&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
219         * calculating <em>alos</em> (dawn) and <em>tzais</em> (nightfall) according to some opinions. This calculation is
220         * based on the position of the sun 90 minutes after sunset in Jerusalem <a href=
221         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> which
222         * calculates to 19.8&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
223         * 
224         * @see #getTzais19Point8Degrees()
225         * @see #getAlos19Point8Degrees()
226         * @see #getAlos90()
227         * @see #getTzais90()
228         * @see #ZENITH_19_DEGREES
229         */
230        protected static final double ZENITH_19_POINT_8 = GEOMETRIC_ZENITH + 19.8;
231
232        /**
233         * The zenith of 26&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
234         * calculating <em>alos</em> (dawn) and <em>tzais</em> (nightfall) according to some opinions. This calculation is
235         * based on the position of the sun {@link #getAlos120() 120 minutes} after sunset in Jerusalem o<a href=
236         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> which
237         * calculates to 26&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}. Since the level of darkness when the sun is
238         * 26&deg; and at a point when the level of darkness is long past the 18&deg; point where the darkest point is reached,
239         * it should only be used <em>lechumra</em> such as delaying the start of nighttime <em>mitzvos</em> or avoiding eating
240         * this early on a fast day.
241         * 
242         * @see #getAlos26Degrees()
243         * @see #getTzais26Degrees()
244         * @see #getAlos120()
245         * @see #getTzais120()
246         */
247        protected static final double ZENITH_26_DEGREES = GEOMETRIC_ZENITH + 26.0;
248
249        /**
250         * The zenith of 4.37&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
251         * calculating <em>tzais</em> (nightfall) according to some opinions. This calculation is based on the position of
252         * the sun {@link #getTzaisGeonim4Point37Degrees() 16 7/8 minutes} after sunset (3/4 of a 22.5 minute <em>mil</em>)
253         * in Jerusalem <a href=
254         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
255         * which calculates to 4.37&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
256         * 
257         * @see #getTzaisGeonim4Point37Degrees()
258         */
259        protected static final double ZENITH_4_POINT_37 = GEOMETRIC_ZENITH + 4.37;
260
261        /**
262         * The zenith of 4.61&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
263         * calculating <em>tzais</em> (nightfall) according to some opinions. This calculation is based on the position of
264         * the sun {@link #getTzaisGeonim4Point37Degrees() 18 minutes} after sunset (3/4 of a 24 minute Mil) in Jerusalem <a href=
265         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
266         * calculates to 4.61&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
267         * @todo add documentation links
268         * 
269         * @see #getTzaisGeonim4Point61Degrees()
270         */
271        protected static final double ZENITH_4_POINT_61 = GEOMETRIC_ZENITH + 4.61;
272
273        /**
274         * The zenith of 4.8&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;).
275         * @todo Add more documentation.
276         * @see #getTzaisGeonim4Point8Degrees()
277         */
278        protected static final double ZENITH_4_POINT_8 = GEOMETRIC_ZENITH + 4.8;
279
280        /**
281         * The zenith of 3.65&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
282         * calculating <em>tzais</em> (nightfall) according to some opinions. This calculation is based on the position of
283         * the sun {@link #getTzaisGeonim3Point65Degrees() 13.5 minutes} after sunset (3/4 of an 18 minute <em>Mil</em>)
284         * in Jerusalem <a href=
285         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> which
286         * calculates to 3.65&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
287         * 
288         * @see #getTzaisGeonim3Point65Degrees()
289         */
290        protected static final double ZENITH_3_POINT_65 = GEOMETRIC_ZENITH + 3.65;
291
292        /**
293         * The zenith of 3.676&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;).
294         * @todo Add more documentation.
295         */
296        protected static final double ZENITH_3_POINT_676 = GEOMETRIC_ZENITH + 3.676;
297
298        /**
299         * The zenith of 5.88&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;).
300         * @todo Add more documentation.
301         */
302        protected static final double ZENITH_5_POINT_88 = GEOMETRIC_ZENITH + 5.88;
303
304        /**
305         * The zenith of 1.583&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
306         * calculating <em>netz amiti</em> (sunrise) and <em>shkiah amiti</em> (sunset) based on the opinion of the
307         * <a href="https://en.wikipedia.org/wiki/Shneur_Zalman_of_Liadi">Baal Hatanya</a>.
308         *
309         * @see #getSunriseBaalHatanya()
310         * @see #getSunsetBaalHatanya()
311         */
312        protected static final double ZENITH_1_POINT_583 = GEOMETRIC_ZENITH + 1.583;
313
314        /**
315         * The zenith of 16.9&deg; below geometric zenith (90&deg;). This calculation is used for determining <em>alos</em>
316         * (dawn) based on the opinion of the Baal Hatanya. It is based on the calculation that the time between dawn
317         * and <em>netz amiti</em> (sunrise) is 72 minutes, the time that is takes to walk 4 <em>mil</em> at 18 minutes
318         * a <em>mil</em> (<a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> and others). The sun's position at 72
319         * minutes before {@link #getSunriseBaalHatanya <em>netz amiti</em> (sunrise)} in Jerusalem <a href=
320         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> is
321         * 16.9&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
322         *
323         * @see #getAlosBaalHatanya()
324         */
325        protected static final double ZENITH_16_POINT_9 = GEOMETRIC_ZENITH + 16.9;
326
327        /**
328         * The zenith of 6&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
329         * calculating <em>tzais</em> / nightfall based on the opinion of the Baal Hatanya. This calculation is based on the
330         * position of the sun 24 minutes after {@link #getSunset sunset} in Jerusalem <a href=
331         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
332         * is 6&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
333         *
334         * @see #getTzaisBaalHatanya()
335         */
336        protected static final double ZENITH_6_DEGREES = GEOMETRIC_ZENITH + 6;
337
338        /**
339         * The zenith of 6.45&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
340         * calculating <em>tzais</em> (nightfall) according to some opinions. This is based on the calculations of <a href=
341         * "https://en.wikipedia.org/wiki/Yechiel_Michel_Tucazinsky">Rabbi Yechiel Michel Tucazinsky</a> of the position of
342         * the sun no later than {@link #getTzaisGeonim6Point45Degrees() 31 minutes} after sunset in Jerusalem, and at the
343         * height of the summer solstice, this <em>zman</em> is 28 minutes after <em>shkiah</em>. This computes to 6.45&deg;
344         * below {@link #GEOMETRIC_ZENITH geometric zenith}. This calculation is found in the <a href=
345         * "https://hebrewbooks.org/pdfpager.aspx?req=50536&st=&pgnum=51">Birur Halacha Yoreh Deah 262</a> it the commonly
346         * used <em>zman</em> in Israel. It should be noted that this differs from the 6.1&deg;/6.2&deg; calculation for
347         * Rabbi Tucazinsky's time as calculated by the Hazmanim Bahalacha Vol II chapter 50:7 (page 515).
348         * 
349         * @see #getTzaisGeonim6Point45Degrees()
350         */
351        protected static final double ZENITH_6_POINT_45 = GEOMETRIC_ZENITH + 6.45;
352        
353        /**
354         * The zenith of 7.65&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
355         * calculating <em>misheyakir</em> according to some opinions.
356         * 
357         * @see #getMisheyakir7Point65Degrees()
358         */
359        protected static final double ZENITH_7_POINT_65 = GEOMETRIC_ZENITH + 7.65;
360        
361        /**
362         * The zenith of 7.67&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
363         * calculating <em>tzais</em> according to some opinions.
364         * 
365         * @see #getTzaisGeonim7Point67Degrees()
366         */
367        protected static final double ZENITH_7_POINT_67 = GEOMETRIC_ZENITH + 7.67;
368        
369        /**
370         * The zenith of 9.3&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
371         * calculating <em>tzais</em> (nightfall) according to some opinions.
372         * 
373         * @see #getTzaisGeonim9Point3Degrees()
374         */
375        protected static final double ZENITH_9_POINT_3 = GEOMETRIC_ZENITH + 9.3;
376        
377        /**
378         * The zenith of 9.5&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
379         * calculating <em>misheyakir</em> according to some opinions.
380         * 
381         * @see #getMisheyakir9Point5Degrees()
382         */
383        protected static final double ZENITH_9_POINT_5 = GEOMETRIC_ZENITH + 9.5;
384        
385        /**
386         * The zenith of 9.75&deg; below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
387         * calculating <em>alos</em> (dawn) and <em>tzais</em> (nightfall) according to some opinions.
388         * 
389         * @see #getTzaisGeonim9Point75Degrees()
390         */
391        protected static final double ZENITH_9_POINT_75 = GEOMETRIC_ZENITH + 9.75;
392        
393        /**
394         * The zenith of 2.1&deg; above {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
395         * calculating the start of <em>bain hashmashos</em> (twilight) of 13.5 minutes before sunset converted to degrees
396         * according to the Yereim. As is traditional with degrees below the horizon, this is calculated without refraction
397         * and from the center of the sun. It would be 0.833&deg; less without this. 
398         * 
399         * @see #getBainHasmashosYereim2Point1Degrees()
400         */
401        protected static final double ZENITH_MINUS_2_POINT_1 = GEOMETRIC_ZENITH - 2.1;
402        
403        /**
404         * The zenith of 2.8&deg; above {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
405         * calculating the start of <em>bain hashmashos</em> (twilight) of 16.875 minutes before sunset converted to degrees
406         * according to the Yereim. As is traditional with degrees below the horizon, this is calculated without refraction
407         * and from the center of the sun. It would be 0.833&deg; less without this.
408         * 
409         * @see #getBainHasmashosYereim2Point8Degrees()
410         */
411        protected static final double ZENITH_MINUS_2_POINT_8 = GEOMETRIC_ZENITH - 2.8;
412        
413        /**
414         * The zenith of 3.05&deg; above {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for
415         * calculating the start of <em>bain hashmashos</em> (twilight) of 18 minutes before sunset converted to degrees
416         * according to the Yereim. As is traditional with degrees below the horizon, this is calculated without refraction
417         * and from the center of the sun. It would be 0.833&deg; less without this.
418         * 
419         * @see #getBainHasmashosYereim3Point05Degrees()
420         */
421        protected static final double ZENITH_MINUS_3_POINT_05 = GEOMETRIC_ZENITH - 3.05;
422
423        /**
424         * The offset in minutes (defaults to 40) after sunset used for <em>tzeit</em> based on calculations of
425         * <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah. 
426         * @see #getTzaisAteretTorah()
427         * @see #getAteretTorahSunsetOffset()
428         * @see #setAteretTorahSunsetOffset(double)
429         */
430        private double ateretTorahSunsetOffset = 40;
431
432        /**
433         * A constructor that takes a {@link GeoLocation} as a parameter.
434         * 
435         * @param location
436         *            the location
437         * 
438         * @see ZmanimCalendar#ZmanimCalendar(GeoLocation)
439         */
440        public ComplexZmanimCalendar(GeoLocation location) {
441                super(location);
442        }
443
444        /**
445         * Default constructor will set a default {@link GeoLocation#GeoLocation()}, a default
446         * {@link AstronomicalCalculator#getDefault() AstronomicalCalculator} and default the calendar to the current date.
447         * 
448         * @see AstronomicalCalendar#AstronomicalCalendar()
449         */
450        public ComplexZmanimCalendar() {
451                super();
452        }
453
454        /**
455         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a 19.8&deg; dip. This calculation
456         * divides the day based on the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen
457         * Avraham (MGA)</a> that the day runs from dawn to dusk. Dawn for this calculation is when the sun is 19.8&deg;
458         * below the eastern geometric horizon before sunrise. Dusk for this is when the sun is 19.8&deg; below the western
459         * geometric horizon after sunset. This day is split into 12 equal parts with each part being a <em>shaah zmanis</em>.
460         * 
461         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
462         *         such as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
463         *         where the sun may not reach low enough below the horizon for this calculation, a {@link Long#MIN_VALUE}
464         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
465         */
466        public long getShaahZmanis19Point8Degrees() {
467                return getTemporalHour(getAlos19Point8Degrees(), getTzais19Point8Degrees());
468        }
469
470        /**
471         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a 18&deg; dip. This calculation divides
472         * the day based on the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham
473         * (MGA)</a> that the day runs from dawn to dusk. Dawn for this calculation is when the sun is 18&deg; below the
474         * eastern geometric horizon before sunrise. Dusk for this is when the sun is 18&deg; below the western geometric
475         * horizon after sunset. This day is split into 12 equal parts with each part being a <em>shaah zmanis</em>.
476         * 
477         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
478         *         such as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
479         *         where the sun may not reach low enough below the horizon for this calculation, a {@link Long#MIN_VALUE}
480         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
481         */
482        public long getShaahZmanis18Degrees() {
483                return getTemporalHour(getAlos18Degrees(), getTzais18Degrees());
484        }
485
486        /**
487         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a dip of 26&deg;. This calculation
488         * divides the day based on the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen
489         * Avraham (MGA)</a> that the day runs from dawn to dusk. Dawn for this calculation is when the sun is
490         * {@link #getAlos26Degrees() 26&deg;} below the eastern geometric horizon before sunrise. Dusk for this is when
491         * the sun is {@link #getTzais26Degrees() 26&deg;} below the western geometric horizon after sunset. This day is
492         * split into 12 equal parts with each part being a <em>shaah zmanis</em>. Since <em>zmanim</em> that use this
493         * method are extremely late or early and at a point when the sky is a long time past the 18&deg; point where the
494         * darkest point is reached, <em>zmanim</em> that use this should only be used <em>lechumra</em>, such as
495         * delaying the start of nighttime <em>mitzvos</em>.
496         * 
497         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
498         *         such as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
499         *         where the sun may not reach low enough below the horizon for this calculation, a {@link Long#MIN_VALUE}
500         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
501         * @see #getShaahZmanis120Minutes()
502         */
503        public long getShaahZmanis26Degrees() {
504                return getTemporalHour(getAlos26Degrees(), getTzais26Degrees());
505        }
506
507        /**
508         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a dip of 16.1&deg;. This calculation
509         * divides the day based on the opinion that the day runs from dawn to dusk. Dawn for this calculation is when the
510         * sun is 16.1&deg; below the eastern geometric horizon before sunrise and dusk is when the sun is 16.1&deg; below
511         * the western geometric horizon after sunset. This day is split into 12 equal parts with each part being a
512         * <em>shaah zmanis</em>.
513         * 
514         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
515         *         such as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
516         *         where the sun may not reach low enough below the horizon for this calculation, a {@link Long#MIN_VALUE}
517         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
518         * 
519         * @see #getAlos16Point1Degrees()
520         * @see #getTzais16Point1Degrees()
521         * @see #getSofZmanShmaMGA16Point1Degrees()
522         * @see #getSofZmanTfilaMGA16Point1Degrees()
523         * @see #getMinchaGedola16Point1Degrees()
524         * @see #getMinchaKetana16Point1Degrees()
525         * @see #getPlagHamincha16Point1Degrees()
526         */
527
528        public long getShaahZmanis16Point1Degrees() {
529                return getTemporalHour(getAlos16Point1Degrees(), getTzais16Point1Degrees());
530        }
531
532        /**
533         * Method to return a <em>shaah zmanis</em> (solar hour) according to the opinion of the <a href=
534         * "https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a>. This calculation
535         * divides the day based on the opinion of the MGA that the day runs from dawn to dusk. Dawn for this calculation is
536         * 60 minutes before sunrise and dusk is 60 minutes after sunset. This day is split into 12 equal parts with each
537         * part being a <em>shaah zmanis</em>. Alternate methods of calculating a <em>shaah zmanis</em> are available in the
538         * subclass {@link ComplexZmanimCalendar}.
539         * 
540         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
541         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
542         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
543         *         {@link AstronomicalCalendar} documentation.
544         * 
545         * @see #getAlos60()
546         * @see #getTzais60()
547         * @see #getPlagHamincha60Minutes()
548         */
549        public long getShaahZmanis60Minutes() {
550                return getTemporalHour(getAlos60(), getTzais60());
551        }
552
553        /**
554         * Method to return a <em>shaah zmanis</em> (solar hour) according to the opinion of the <a href=
555         * "https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a>. This calculation divides the day
556         * based on the opinion of the MGA that the day runs from dawn to dusk. Dawn for this calculation is 72 minutes
557         * before sunrise and dusk is 72 minutes after sunset. This day is split into 12 equal parts with each part
558         * being a <em>shaah zmanis</em>. Alternate methods of calculating a <em>shaah zmanis</em> are available in the
559         * subclass {@link ComplexZmanimCalendar}.
560         * 
561         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
562         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
563         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
564         *         {@link AstronomicalCalendar} documentation.
565         */
566        public long getShaahZmanis72Minutes() {
567                return getShaahZmanisMGA();
568        }
569
570        /**
571         * Method to return a <em>shaah zmanis</em> (temporal hour) according to the opinion of the <a href=
572         * "https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em> being
573         * {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This calculation
574         * divides the day based on the opinion of the MGA that the day runs from dawn to dusk. Dawn for this calculation
575         * is 72 minutes <em>zmaniyos</em> before sunrise and dusk is 72 minutes <em>zmaniyos</em> after sunset. This day
576         * is split into 12 equal parts with each part being a <em>shaah zmanis</em>. This is identical to 1/10th of the day
577         * from {@link #getSunrise() sunrise} to {@link #getSunset() sunset}.
578         * 
579         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
580         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
581         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
582         *         {@link AstronomicalCalendar} documentation.
583         * @see #getAlos72Zmanis()
584         * @see #getTzais72Zmanis()
585         */
586        public long getShaahZmanis72MinutesZmanis() {
587                return getTemporalHour(getAlos72Zmanis(), getTzais72Zmanis());
588        }
589
590        /**
591         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a dip of 90 minutes. This calculation
592         * divides the day based on the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen
593         * Avraham (MGA)</a> that the day runs from dawn to dusk. Dawn for this calculation is 90 minutes before sunrise
594         * and dusk is 90 minutes after sunset. This day is split into 12 equal parts with each part being a <em>shaah zmanis</em>.
595         * 
596         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
597         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
598         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
599         *         {@link AstronomicalCalendar} documentation.
600         */
601        public long getShaahZmanis90Minutes() {
602                return getTemporalHour(getAlos90(), getTzais90());
603        }
604
605        /**
606         * Method to return a <em>shaah zmanis</em> (temporal hour) according to the opinion of the <a href=
607         * "https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em> being
608         * {@link #getAlos90Zmanis() 90} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This calculation divides
609         * the day based on the opinion of the MGA that the day runs from dawn to dusk. Dawn for this calculation is 90 minutes
610         * <em>zmaniyos</em> before sunrise and dusk is 90 minutes <em>zmaniyos</em> after sunset. This day is split into 12 equal
611         * parts with each part being a <em>shaah zmanis</em>. This is 1/8th of the day from {@link #getSunrise() sunrise} to
612         * {@link #getSunset() sunset}.
613         * 
614         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
615         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
616         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
617         *         {@link AstronomicalCalendar} documentation.
618         * @see #getAlos90Zmanis()
619         * @see #getTzais90Zmanis()
620         */
621        public long getShaahZmanis90MinutesZmanis() {
622                return getTemporalHour(getAlos90Zmanis(), getTzais90Zmanis());
623        }
624
625        /**
626         * Method to return a <em>shaah zmanis</em> (temporal hour) according to the opinion of the <a href=
627         * "https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em> being {@link
628         * #getAlos96Zmanis() 96} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This calculation divides the
629         * day based on the opinion of the MGA that the day runs from dawn to dusk. Dawn for this calculation is 96 minutes
630         * <em>zmaniyos</em> before sunrise and dusk is 96 minutes <em>zmaniyos</em> after sunset. This day is split into 12
631         * equal parts with each part being a <em>shaah zmanis</em>. This is identical to 1/7.5th of the day from
632         * {@link #getSunrise() sunrise} to {@link #getSunset() sunset}.
633         * 
634         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
635         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
636         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
637         *         {@link AstronomicalCalendar} documentation.
638         * @see #getAlos96Zmanis()
639         * @see #getTzais96Zmanis()
640         */
641        public long getShaahZmanis96MinutesZmanis() {
642                return getTemporalHour(getAlos96Zmanis(), getTzais96Zmanis());
643        }
644
645        /**
646         * Method to return a <em>shaah zmanis</em> (temporal hour) according to the opinion of the
647         * <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah calculated with <em>alos</em> being 1/10th
648         * of sunrise to sunset day, or {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em> of such a day before
649         * {@link #getSunrise() sunrise}, and <em>tzais</em> is usually calculated as {@link #getTzaisAteretTorah() 40
650         * minutes} (configurable to any offset via {@link #setAteretTorahSunsetOffset(double)}) after {@link #getSunset()
651         * sunset}. This day is split into 12 equal parts with each part being a <em>shaah zmanis</em>. Note that with this
652         * system, <em>chatzos</em> (mid-day) will not be the point that the sun is {@link #getSunTransit() halfway across
653         * the sky}.
654         * 
655         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
656         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
657         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
658         *         {@link AstronomicalCalendar} documentation.
659         * @see #getAlos72Zmanis()
660         * @see #getTzaisAteretTorah()
661         * @see #getAteretTorahSunsetOffset()
662         * @see #setAteretTorahSunsetOffset(double)
663         */
664        public long getShaahZmanisAteretTorah() {
665                return getTemporalHour(getAlos72Zmanis(), getTzaisAteretTorah());
666        }
667
668        /**
669         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a dip of 96 minutes. This calculation
670         * divides the day based on the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen
671         * Avraham (MGA)</a> that the day runs from dawn to dusk. Dawn for this calculation is 96 minutes before sunrise
672         * and dusk is 96 minutes after sunset. This day is split into 12 equal parts with each part being a <em>shaah
673         * zmanis</em>.
674         * 
675         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
676         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
677         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
678         *         {@link AstronomicalCalendar} documentation.
679         */
680        public long getShaahZmanis96Minutes() {
681                return getTemporalHour(getAlos96(), getTzais96());
682        }
683
684        /**
685         * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using a dip of 120 minutes. This calculation
686         * divides the day based on the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen
687         * Avraham (MGA)</a> that the day runs from dawn to dusk. Dawn for this calculation is 120 minutes before sunrise and
688         * dusk is 120 minutes after sunset. This day is split into 12 equal parts with each part being a <em>shaah zmanis</em>.
689         * Since <em>zmanim</em> that use this method are extremely late or early and at a point when the sky is a long time
690         * past the 18&deg; point where the darkest point is reached, <em>zmanim</em> that use this should only be used
691         * <em>lechumra</em> only, such as delaying the start of nighttime <em>mitzvos</em>.
692         * 
693         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
694         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
695         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
696         *         {@link AstronomicalCalendar} documentation.
697         * @see #getShaahZmanis26Degrees()
698         */
699        public long getShaahZmanis120Minutes() {
700                return getTemporalHour(getAlos120(), getTzais120());
701        }
702
703        /**
704         * Method to return a <em>shaah zmanis</em> (temporal hour) according to the opinion of the <a href=
705         * "https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em> being {@link
706         * #getAlos120Zmanis() 120} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This calculation divides
707         * the day based on the opinion of the MGA that the day runs from dawn to dusk. Dawn for this calculation is
708         * 120 minutes <em>zmaniyos</em> before sunrise and dusk is 120 minutes <em>zmaniyos</em> after sunset. This day is
709         * split into 12 equal parts with each part being a <em>shaah zmanis</em>. This is identical to 1/6th of the day from
710         * {@link #getSunrise() sunrise} to {@link #getSunset() sunset}. Since <em>zmanim</em> that use this method are
711         * extremely late or early and at a point when the sky is a long time past the 18&deg; point where the darkest point
712         * is reached, <em>zmanim</em> that use this should only be used <em>lechumra</em> such as delaying the start of
713         * nighttime <em>mitzvos</em>.
714         * 
715         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em>. If the calculation can't be computed
716         *         such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
717         *         where it does not set, a {@link Long#MIN_VALUE} will be returned. See detailed explanation on top of the
718         *         {@link AstronomicalCalendar} documentation.
719         * @see #getAlos120Zmanis()
720         * @see #getTzais120Zmanis()
721         */
722        public long getShaahZmanis120MinutesZmanis() {
723                return getTemporalHour(getAlos120Zmanis(), getTzais120Zmanis());
724        }
725
726        /**
727         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> based on sunrise
728         * being 120 minutes <em>zmaniyos</em> or 1/6th of the day before sunrise. This is calculated as 10.75 hours after
729         * {@link #getAlos120Zmanis() dawn}. The formula used is 10.75 * {@link #getShaahZmanis120MinutesZmanis()} after
730         * {@link #getAlos120Zmanis() dawn}. Since the <em>zman</em> based on an extremely early <em>alos</em> and a very
731         * late <em>tzais</em>, it should only be used <em>lechumra</em>.
732         * 
733         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
734         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
735         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
736         * 
737         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
738         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
739         *         does not set, a null will be returned. See detailed explanation on top of the
740         *         {@link AstronomicalCalendar} documentation.
741         * 
742         * @see #getShaahZmanis120MinutesZmanis()
743         * @see #getAlos120()
744         * @see #getTzais120()
745         * @see #getPlagHamincha26Degrees()
746         * @see #getPlagHamincha120Minutes()
747         */
748        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
749        public Date getPlagHamincha120MinutesZmanis() {
750                return getPlagHamincha(getAlos120Zmanis(), getTzais120Zmanis());
751        }
752
753        /**
754         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> according to the
755         * Magen Avraham with the day starting 120 minutes before sunrise and ending 120 minutes after sunset. This is
756         * calculated as 10.75 hours after {@link #getAlos120() dawn 120 minutes}. The formula used is 10.75 {@link
757         * #getShaahZmanis120Minutes()} after {@link #getAlos120()}. Since the <em>zman</em> based on an extremely early
758         * <em>alos</em> and a very late <em>tzais</em>, it should only be used <em>lechumra</em>.
759         * 
760         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
761         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
762         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
763         * 
764         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
765         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
766         *         does not set, a null will be returned. See detailed explanation on top of the
767         *         {@link AstronomicalCalendar} documentation.
768         * 
769         * @see #getShaahZmanis120Minutes()
770         * @see #getPlagHamincha26Degrees()
771         */
772        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
773        public Date getPlagHamincha120Minutes() {
774                return getPlagHamincha(getAlos120(), getTzais120());
775        }
776
777        /**
778         * Method to return <em>alos</em> (dawn) calculated as 60 minutes before sunrise. This is the time to walk the 
779         * distance of 4 <em>Mil</em> at 15 minutes a <em>Mil</em>. This seems to be the opinion of the <a href=
780         * "https://en.wikipedia.org/wiki/Yair_Bacharach">Chavas Yair</a> in the Mekor Chaim, Orach Chaim Ch.
781         * 90, though  the Mekor chaim in Ch. 58 and in the <a href=
782         * "https://hebrewbooks.org/pdfpager.aspx?req=45193&pgnum=214">Chut Hashani Cha 97</a> states that
783         * a a person walks 3 and a 1/3 <em>mil</em> in an hour, or an 18 minute <em>mil</em>. Also see the <a href=
784         * "https://he.wikipedia.org/wiki/%D7%9E%D7%9C%D7%9B%D7%99%D7%90%D7%9C_%D7%A6%D7%91%D7%99_%D7%98%D7%A0%D7%A0%D7%91%D7%95%D7%99%D7%9D"
785         * >Divrei Malkiel</a> <a href="https://hebrewbooks.org/pdfpager.aspx?req=803&pgnum=33">Vol. 4, Ch. 20, page 34</a>) who
786         * mentions the 15 minute <em>mil</em> lechumra by baking matzos. Also see the <a href=
787         * "https://en.wikipedia.org/wiki/Joseph_Colon_Trabotto">Maharik</a> <a href=
788         * "https://hebrewbooks.org/pdfpager.aspx?req=1142&pgnum=216">Ch. 173</a> where the questioner quoting the
789         * <a href="https://en.wikipedia.org/wiki/Eliezer_ben_Nathan">Ra'avan</a> is of the opinion that the time to walk a
790         * <em>mil</em> is 15 minutes (5 <em>mil</em> in a little over an hour). There are many who believe that there is a
791         * <em>ta'us sofer</em> (scribe's error) in the Ra'avan, and it should 4 <em>mil</em> in a little over an hour, or an
792         * 18 minute <em>mil</em>. Time based offset calculations are based on the opinion of the
793         * <em><a href="https://en.wikipedia.org/wiki/Rishonim">Rishonim</a></em> who stated that the time of the <em>neshef</em>
794         * (time between dawn and sunrise) does not vary by the time of year or location but purely depends on the time it takes to
795         * walk the distance of 4* <em>mil</em>. {@link #getTzaisGeonim9Point75Degrees()} is a related <em>zman</em> that is a
796         * degree based calculation based on 60 minutes.
797         * 
798         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
799         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
800         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}.
801         *         documentation.
802         *
803         * @see #getTzais60()
804         * @see #getPlagHamincha60Minutes()
805         * @see #getShaahZmanis60Minutes()
806         */
807        public Date getAlos60() {
808                return getTimeOffset(getSunrise(), -60 * MINUTE_MILLIS);
809        }
810
811        /**
812         * Method to return <em>alos</em> (dawn) calculated using 72 minutes <em>zmaniyos</em> or 1/10th of the day before
813         * sunrise. This is based on an 18 minute <em>Mil</em> so the time for 4 <em>Mil</em> is 72 minutes which is 1/10th
814         * of a day (12 * 60 = 720) based on the a day being from {@link #getSeaLevelSunrise() sea level sunrise} to
815         * {@link #getSeaLevelSunrise sea level sunset} or {@link #getSunrise() sunrise} to {@link #getSunset() sunset}
816         * (depending on the {@link #isUseElevation()} setting).
817         * The actual calculation is {@link #getSeaLevelSunrise()} - ({@link #getShaahZmanisGra()} * 1.2). This calculation
818         * is used in the calendars published by the <a href=
819         * "https://en.wikipedia.org/wiki/Central_Rabbinical_Congress">Hisachdus Harabanim D'Artzos Habris Ve'Canada</a>.
820         * 
821         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
822         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
823         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
824         *         documentation.
825         * @see #getShaahZmanisGra()
826         */
827        public Date getAlos72Zmanis() {
828                return getZmanisBasedOffset(-1.2);
829        }
830
831        /**
832         * Method to return <em>alos</em> (dawn) calculated using 96 minutes before before {@link #getSunrise() sunrise} or
833         * {@link #getSeaLevelSunrise() sea level sunrise} (depending on the {@link #isUseElevation()} setting) that is based
834         * on the time to walk the distance of 4 <em>Mil</em> at 24 minutes a <em>Mil</em>. Time based offset
835         * calculations for <em>alos</em> are based on the opinion of the <em><a href="https://en.wikipedia.org/wiki/Rishonim"
836         * >Rishonim</a></em> who stated that the time of the <em>Neshef</em> (time between dawn and sunrise) does not vary
837         * by the time of year or location but purely depends on the time it takes to walk the distance of 4 <em>Mil</em>.
838         * 
839         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
840         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
841         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
842         *         documentation.
843         */
844        public Date getAlos96() {
845                return getTimeOffset(getElevationAdjustedSunrise(), -96 * MINUTE_MILLIS);
846        }
847
848        /**
849         * Method to return <em>alos</em> (dawn) calculated using 90 minutes <em>zmaniyos</em> or 1/8th of the day before
850         * {@link #getSunrise() sunrise} or {@link #getSeaLevelSunrise() sea level sunrise} (depending on the {@link
851         * #isUseElevation()} setting). This is based on a 22.5 minute <em>Mil</em> so the time for 4 <em>Mil</em> is 90
852         * minutes which is 1/8th of a day (12 * 60) / 8 = 90
853         * The day is calculated from {@link #getSeaLevelSunrise() sea level sunrise} to {@link #getSeaLevelSunrise sea level
854         * sunset} or {@link #getSunrise() sunrise} to {@link #getSunset() sunset} (depending on the {@link #isUseElevation()}.
855         * The actual calculation used is {@link #getSunrise()} - ({@link #getShaahZmanisGra()} * 1.5).
856         * 
857         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
858         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
859         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
860         *         documentation.
861         * @see #getShaahZmanisGra()
862         */
863        public Date getAlos90Zmanis() {
864                return getZmanisBasedOffset(-1.5);
865        }
866
867        /**
868         * This method returns <em>alos</em> (dawn) calculated using 96 minutes <em>zmaniyos</em> or 1/7.5th of the day before
869         * {@link #getSunrise() sunrise} or {@link #getSeaLevelSunrise() sea level sunrise} (depending on the {@link
870         * #isUseElevation()} setting). This is based on a 24 minute <em>Mil</em> so the time for 4 <em>Mil</em> is 96
871         * minutes which is 1/7.5th of a day (12 * 60 / 7.5 = 96).
872         * The day is calculated from {@link #getSeaLevelSunrise() sea level sunrise} to {@link #getSeaLevelSunrise sea level
873         * sunset} or {@link #getSunrise() sunrise} to {@link #getSunset() sunset} (depending on the {@link #isUseElevation()}.
874         * The actual calculation used is {@link #getSunrise()} - ({@link #getShaahZmanisGra()} * 1.6).
875         * 
876         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
877         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
878         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
879         *         documentation.
880         * @see #getShaahZmanisGra()
881         */
882        public Date getAlos96Zmanis() {
883                return getZmanisBasedOffset(-1.6);
884        }
885
886        /**
887         * Method to return <em>alos</em> (dawn) calculated using 90 minutes before {@link #getSeaLevelSunrise() sea level
888         * sunrise} based on the time to walk the distance of 4 <em>Mil</em> at 22.5 minutes a <em>Mil</em>. Time based
889         * offset calculations for <em>alos</em> are based on the opinion of the <em><a href=
890         * "https://en.wikipedia.org/wiki/Rishonim">Rishonim</a></em> who stated that the time of the <em>Neshef</em>
891         * (time between dawn and sunrise) does not vary by the time of year or location but purely depends on the time it
892         * takes to walk the distance of 4 <em>Mil</em>.
893         * 
894         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
895         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
896         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
897         *         documentation.
898         */
899        public Date getAlos90() {
900                return getTimeOffset(getElevationAdjustedSunrise(), -90 * MINUTE_MILLIS);
901        }
902
903        /**
904         * This method should be used <em>lechumra</em> only and returns <em>alos</em> (dawn) calculated using 120 minutes
905         * before {@link #getSeaLevelSunrise() sea level sunrise} (no adjustment for elevation is made) based on the time
906         * to walk the distance of 5 <em>Mil</em>(<em>Ula</em>) at 24 minutes a <em>Mil</em>. Time based offset calculations
907         * for <em>alos</em> are based on the* opinion of the <em><a href="https://en.wikipedia.org/wiki/Rishonim">Rishonim</a>
908         * </em> who stated that the time of the <em>neshef</em> (time between dawn and sunrise) does not vary by the time of
909         * year or location but purely depends on the time it takes to walk the distance of 5 <em>Mil</em>(<em>Ula</em>). Since
910         * this time is extremely early, it should only be used <em>lechumra</em>, such as not eating after this time on a fast
911         * day, and not as the start time for <em>mitzvos</em> that can only be performed during the day.
912         * 
913         * @deprecated This method should be used <em>lechumra</em> only (such as stopping to eat at this time on a fast day),
914         *         since it returns a very early time, and if used <em>lekula</em> can result in doing <em>mitzvos hayom</em>
915         *         too early according to most opinions. There is no current plan to remove this method from the API, and this
916         *         deprecation is intended to alert developers of the danger of using it.
917         * 
918         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
919         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
920         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
921         *         documentation.
922         * 
923         * @see #getTzais120()
924         * @see #getAlos26Degrees()
925         */
926        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
927        public Date getAlos120() {
928                return getTimeOffset(getElevationAdjustedSunrise(), -120 * MINUTE_MILLIS);
929        }
930
931        /**
932         * This method should be used <em>lechumra</em> only and  method returns <em>alos</em> (dawn) calculated using
933         * 120 minutes <em>zmaniyos</em> or 1/6th of the day before {@link #getSunrise() sunrise} or {@link
934         * #getSeaLevelSunrise() sea level sunrise} (depending on the {@link #isUseElevation()} setting). This is based
935         * on a 24 minute <em>Mil</em> so the time for 5 <em>Mil</em> is 120 minutes which is 1/6th of a day (12 * 60 /
936         * 6 = 120). The day is calculated from {@link #getSeaLevelSunrise() sea level sunrise} to {@link
937         * #getSeaLevelSunrise sea level sunset} or {@link #getSunrise() sunrise} to {@link #getSunset() sunset} (depending
938         * on the {@link #isUseElevation()}. The actual calculation used is {@link #getSunrise()} - ({@link
939         * #getShaahZmanisGra()} * 2). Since this time is extremely early, it should only be used <em>lechumra</em>, such
940         * as not eating after this time on a fast day, and not as the start time for <em>mitzvos</em> that can only be
941         * performed during the day.
942         * 
943         * @deprecated This method should be used <em>lechumra</em> only (such as stopping to eat at this time on a fast day),
944         *         since it returns a very early time, and if used <em>lekula</em> can result in doing <em>mitzvos hayom</em>
945         *         too early according to most opinions. There is no current plan to remove this method from the API, and this
946         *         deprecation is intended to alert developers of the danger of using it.
947         * 
948         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
949         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
950         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
951         *         documentation.
952         * @see #getAlos120()
953         * @see #getAlos26Degrees()
954         */
955        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
956        public Date getAlos120Zmanis() {
957                return getZmanisBasedOffset(-2.0);
958        }
959
960        /**
961         * This method should be used <em>lechumra</em> only and returns <em>alos</em> (dawn) calculated when the sun is {@link
962         * #ZENITH_26_DEGREES 26&deg;} below the eastern geometric horizon before sunrise. This calculation is based on the same
963         * calculation of {@link #getAlos120() 120 minutes} but uses a degree based calculation instead of 120 exact minutes. This
964         * calculation is based on the position of the sun 120 minutes before sunrise in Jerusalem <a href=
965         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
966         * calculates to 26&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}. Since this time is extremely early, it should
967         * only be used <em>lechumra</em> only, such as not eating after this time on a fast day, and not as the start time for
968         * <em>mitzvos</em> that can only be performed during the day.
969         * 
970         * @deprecated This method should be used <em>lechumra</em> only (such as stopping to eat at this time on a fast day),
971         *         since it returns a very early time, and if used <em>lekula</em> can result in doing <em>mitzvos hayom</em>
972         *         too early according to most opinions. There is no current plan to remove this  method from the API, and this
973         *         deprecation is intended to alert developers of the danger of using it.
974         * 
975         * @return the <code>Date</code> representing <em>alos</em>. If the calculation can't be computed such as northern
976         *         and southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun
977         *         may not reach low enough below the horizon for this calculation, a null will be returned. See detailed
978         *         explanation on top of the {@link AstronomicalCalendar} documentation.
979         * @see #ZENITH_26_DEGREES
980         * @see #getAlos120()
981         * @see #getTzais120()
982         * @see #getTzais26Degrees()
983         */
984        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
985        public Date getAlos26Degrees() {
986                return getSunriseOffsetByDegrees(ZENITH_26_DEGREES);
987        }
988
989        /**
990         * A method to return <em>alos</em> (dawn) calculated when the sun is {@link #ASTRONOMICAL_ZENITH 18&deg;} below the
991         * eastern geometric horizon before sunrise.
992         * 
993         * @return the <code>Date</code> representing <em>alos</em>. If the calculation can't be computed such as northern
994         *         and southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun
995         *         may not reach low enough below the horizon for this calculation, a null will be returned. See detailed
996         *         explanation on top of the {@link AstronomicalCalendar} documentation.
997         * @see #ASTRONOMICAL_ZENITH
998         */
999        public Date getAlos18Degrees() {
1000                return getSunriseOffsetByDegrees(ASTRONOMICAL_ZENITH);
1001        }
1002        
1003        /**
1004         * A method to return <em>alos</em> (dawn) calculated when the sun is {@link #ZENITH_19_DEGREES 19&deg;} below the
1005         * eastern geometric horizon before sunrise. This is the <a href="https://en.wikipedia.org/wiki/Maimonides"
1006         * >Rambam</a>'s <em>alos</em> according to Rabbi Moshe Kosower's <a href=
1007         * "https://www.worldcat.org/oclc/145454098">Maaglei Tzedek</a>, page 88, <a href=
1008         * "https://hebrewbooks.org/pdfpager.aspx?req=33464&pgnum=13">Ayeles Hashachar Vol. I, page 12</a>, <a href=
1009         * "https://hebrewbooks.org/pdfpager.aspx?req=55960&pgnum=258">Yom Valayla Shel Torah, Ch. 34, p. 222</a> and 
1010         * Rabbi Yaakov Shakow's <a href="https://www.worldcat.org/oclc/1043573513">Luach Ikvei Hayom</a>.
1011         * 
1012         * @return the <code>Date</code> representing <em>alos</em>. If the calculation can't be computed such as northern
1013         *         and southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun
1014         *         may not reach low enough below the horizon for this calculation, a null will be returned. See detailed
1015         *         explanation on top of the {@link AstronomicalCalendar} documentation.
1016         * @see #ASTRONOMICAL_ZENITH
1017         */
1018        public Date getAlos19Degrees() {
1019                return getSunriseOffsetByDegrees(ZENITH_19_DEGREES);
1020        }
1021
1022        /**
1023         * Method to return <em>alos</em> (dawn) calculated when the sun is {@link #ZENITH_19_POINT_8 19.8&deg;} below the
1024         * eastern geometric horizon before sunrise. This calculation is based on the same calculation of
1025         * {@link #getAlos90() 90 minutes} but uses a degree based calculation instead of 90 exact minutes. This calculation
1026         * is based on the position of the sun 90 minutes before sunrise in Jerusalem <a href=
1027         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
1028         * calculates to 19.8&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
1029         * 
1030         * @return the <code>Date</code> representing <em>alos</em>. If the calculation can't be computed such as northern
1031         *         and southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun
1032         *         may not reach low enough below the horizon for this calculation, a null will be returned. See detailed
1033         *         explanation on top of the {@link AstronomicalCalendar} documentation.
1034         * @see #ZENITH_19_POINT_8
1035         * @see #getAlos90()
1036         */
1037        public Date getAlos19Point8Degrees() {
1038                return getSunriseOffsetByDegrees(ZENITH_19_POINT_8);
1039        }
1040
1041        /**
1042         * Method to return <em>alos</em> (dawn) calculated when the sun is {@link #ZENITH_16_POINT_1 16.1&deg;} below the
1043         * eastern geometric horizon before sunrise. This calculation is based on the same calculation of
1044         * {@link #getAlos72() 72 minutes} but uses a degree based calculation instead of 72 exact minutes. This calculation
1045         * is based on the position of the sun 72 minutes before sunrise in Jerusalem <a href=
1046         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, which
1047         * calculates to 16.1&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
1048         * 
1049         * @return the <code>Date</code> representing <em>alos</em>. If the calculation can't be computed such as northern
1050         *         and southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun
1051         *         may not reach low enough below the horizon for this calculation, a null will be returned. See detailed
1052         *         explanation on top of the {@link AstronomicalCalendar} documentation.
1053         * @see #ZENITH_16_POINT_1
1054         * @see #getAlos72()
1055         */
1056        public Date getAlos16Point1Degrees() {
1057                return getSunriseOffsetByDegrees(ZENITH_16_POINT_1);
1058        }
1059
1060        /**
1061         * This method returns <em>misheyakir</em> based on the position of the sun when it is {@link #ZENITH_11_DEGREES
1062         * 11.5&deg;} below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for calculating
1063         * <em>misheyakir</em> according to some opinions. This calculation is based on the position of the sun 52 minutes
1064         * before {@link #getSunrise sunrise} in Jerusalem <a href=
1065         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
1066         * which calculates to 11.5&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
1067         * @todo recalculate.
1068         * 
1069         * @return the <code>Date</code> of <em>misheyakir</em>. If the calculation can't be computed such as northern and
1070         *         southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may
1071         *         not reach low enough below the horizon for this calculation, a null will be returned. See detailed
1072         *         explanation on top of the {@link AstronomicalCalendar} documentation.
1073         * @see #ZENITH_11_POINT_5
1074         */
1075        public Date getMisheyakir11Point5Degrees() {
1076                return getSunriseOffsetByDegrees(ZENITH_11_POINT_5);
1077        }
1078
1079        /**
1080         * This method returns <em>misheyakir</em> based on the position of the sun when it is {@link #ZENITH_11_DEGREES
1081         * 11&deg;} below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for calculating
1082         * <em>misheyakir</em> according to some opinions. This calculation is based on the position of the sun 48 minutes
1083         * before {@link #getSunrise sunrise} in Jerusalem d<a href=
1084         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
1085         * which calculates to 11&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
1086         * 
1087         * @return If the calculation can't be computed such as northern and southern locations even south of the Arctic
1088         *         Circle and north of the Antarctic Circle where the sun may not reach low enough below the horizon for
1089         *         this calculation, a null will be returned. See detailed explanation on top of the
1090         *         {@link AstronomicalCalendar} documentation.
1091         * @see #ZENITH_11_DEGREES
1092         */
1093        public Date getMisheyakir11Degrees() {
1094                return getSunriseOffsetByDegrees(ZENITH_11_DEGREES);
1095        }
1096
1097        /**
1098         * This method returns <em>misheyakir</em> based on the position of the sun when it is {@link #ZENITH_10_POINT_2
1099         * 10.2&deg;} below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is used for calculating
1100         * <em>misheyakir</em> according to some opinions. This calculation is based on the position of the sun 45 minutes
1101         * before {@link #getSunrise sunrise} in Jerusalem <a href=
1102         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox</a> which calculates
1103         * to 10.2&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
1104         * 
1105         * @return the <code>Date</code> of <em>misheyakir</em>. If the calculation can't be computed such as
1106         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
1107         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
1108         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1109         * @see #ZENITH_10_POINT_2
1110         */
1111        public Date getMisheyakir10Point2Degrees() {
1112                return getSunriseOffsetByDegrees(ZENITH_10_POINT_2);
1113        }
1114        
1115        /**
1116         * This method returns <em>misheyakir</em> based on the position of the sun when it is {@link #ZENITH_7_POINT_65
1117         * 7.65&deg;} below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). The degrees are based on a 35/36 minute
1118         * <em>zman</em> <a href="https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the
1119         * equinox / equilux</a>, when the <em>neshef</em> (twilight) is the shortest. This time is based on <a href=
1120         * "https://en.wikipedia.org/wiki/Moshe_Feinstein">Rabbi Moshe Feinstein</a> who writes in <a href=
1121         * "https://hebrewbooks.org/pdfpager.aspx?req=14677&pgnum=7">Ohr Hachaim Vol. 4, Ch. 6</a>)
1122         * that <em>misheyakir</em> in New York is 35-40 minutes before sunset, something that is a drop less than 8&deg;.
1123         * <a href="https://en.wikipedia.org/wiki/Yisroel_Taplin">Rabbi Yisroel Taplin</a> in <a href=
1124         * "https://www.worldcat.org/oclc/889556744">Zmanei Yisrael</a> (page 117) notes that <a href=
1125         * "https://en.wikipedia.org/wiki/Yaakov_Kamenetsky">Rabbi Yaakov Kamenetsky</a> stated that it is not less than 36
1126         * minutes before sunrise (maybe it is 40 minutes). Sefer Yisrael Vehazmanim (p. 7) quotes the Tamar Yifrach
1127         * in the name of the <a href="https://en.wikipedia.org/wiki/Joel_Teitelbaum">Satmar Rov</a> that one should be stringent
1128         * not consider <em>misheyakir</em> before 36 minutes. This is also the accepted <a href=
1129         * "https://en.wikipedia.org/wiki/Minhag">minhag</a> in <a href=
1130         * "https://en.wikipedia.org/wiki/Lakewood_Township,_New_Jersey">Lakewood</a> that is used in the <a href=
1131         * "https://en.wikipedia.org/wiki/Beth_Medrash_Govoha">Yeshiva</a>. This follows the opinion of <a href=
1132         * "https://en.wikipedia.org/wiki/Shmuel_Kamenetsky">Rabbi Shmuel Kamenetsky</a> who provided the time of 35/36 minutes,
1133         * but did not provide a degree based time. Since this <em>zman</em> depends on the level of light, Rabbi Yaakov Shakow
1134         * presented this degree based calculations to Rabbi Kamenetsky who agreed to them.
1135         * 
1136         * @return the <code>Date</code> of <em>misheyakir</em>. If the calculation can't be computed such as
1137         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
1138         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
1139         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1140         * 
1141         * @see #ZENITH_7_POINT_65
1142         * @see #getMisheyakir9Point5Degrees()
1143         */
1144        public Date getMisheyakir7Point65Degrees() {
1145                return getSunriseOffsetByDegrees(ZENITH_7_POINT_65);
1146        }
1147        
1148        /**
1149         * This method returns <em>misheyakir</em> based on the position of the sun when it is {@link #ZENITH_9_POINT_5
1150         * 9.5&deg;} below {@link #GEOMETRIC_ZENITH geometric zenith} (90&deg;). This calculation is based on Rabbi Dovid Kronglass's
1151         * Calculation of 45 minutes in Baltimore as mentioned in <a href=
1152         * "https://hebrewbooks.org/pdfpager.aspx?req=20287&pgnum=29">Divrei Chachamim No. 24</a> brought down by the <a href=
1153         * "https://hebrewbooks.org/pdfpager.aspx?req=50535&pgnum=87">Birur Halacha, Tinyana, Ch. 18</a>. This calculates to
1154         * 9.5&deg;. Also see <a href="https://en.wikipedia.org/wiki/Jacob_Isaac_Neiman">Rabbi Yaakov Yitzchok Neiman</a> in Kovetz
1155         * Eitz Chaim Vol. 9, p. 202 that the Vya'an Yosef did not want to rely on times earlier than 45 minutes in New York. This
1156         * <em>zman</em> is also used in the calendars published by Rabbi Hershel Edelstein. As mentioned in Yisroel Vehazmanim,
1157         * Rabbi Edelstein who was given the 45 minute <em>zman</em> by Rabbi Bick. The calendars published by the <em><a href=
1158         * "https://en.wikipedia.org/wiki/Mizrahi_Jews">Edot Hamizrach</a></em> communities also use this <em>zman</em>. This also
1159         * follows the opinion of <a href="https://en.wikipedia.org/wiki/Shmuel_Kamenetsky">Rabbi Shmuel Kamenetsky</a> who provided
1160         * the time of 36 and 45 minutes, but did not provide a degree based time. Since this <em>zman</em> depends on the level of
1161         * light, Rabbi Yaakov Shakow presented these degree based times to Rabbi Shmuel Kamenetsky who agreed to them.
1162         * 
1163         * @return the <code>Date</code> of <em>misheyakir</em>. If the calculation can't be computed such as
1164         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
1165         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
1166         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1167         * 
1168         * @see #ZENITH_9_POINT_5
1169         * @see #getMisheyakir7Point65Degrees()
1170         */
1171        public Date getMisheyakir9Point5Degrees() {
1172                return getSunriseOffsetByDegrees(ZENITH_9_POINT_5);
1173        }
1174
1175        /**
1176         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1177         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1178         * <em>alos</em> being {@link #getAlos19Point8Degrees() 19.8&deg;} before {@link #getSunrise() sunrise}. This
1179         * time is 3 {@link #getShaahZmanis19Point8Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link
1180         * #getAlos19Point8Degrees() dawn} based on the opinion of the MGA that the day is calculated from dawn to nightfall
1181         * with both being 19.8&deg; below sunrise or sunset. This returns the time of 3 *
1182         * {@link #getShaahZmanis19Point8Degrees()} after {@link #getAlos19Point8Degrees() dawn}.
1183         * 
1184         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1185         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1186         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1187         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1188         * @see #getShaahZmanis19Point8Degrees()
1189         * @see #getAlos19Point8Degrees()
1190         */
1191        public Date getSofZmanShmaMGA19Point8Degrees() {
1192                return getSofZmanShma(getAlos19Point8Degrees(), getTzais19Point8Degrees());
1193        }
1194
1195        /**
1196         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1197         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1198         * on <em>alos</em> being {@link #getAlos16Point1Degrees() 16.1&deg;} before {@link #getSunrise() sunrise}. This time
1199         * is 3 {@link #getShaahZmanis16Point1Degrees() <em>shaos zmaniyos</em>} (solar hours) after
1200         * {@link #getAlos16Point1Degrees() dawn} based on the opinion of the MGA that the day is calculated from
1201         * dawn to nightfall with both being 16.1&deg; below sunrise or sunset. This returns the time of
1202         * 3 * {@link #getShaahZmanis16Point1Degrees()} after {@link #getAlos16Point1Degrees() dawn}.
1203         * 
1204         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1205         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1206         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1207         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1208         * @see #getShaahZmanis16Point1Degrees()
1209         * @see #getAlos16Point1Degrees()
1210         */
1211        public Date getSofZmanShmaMGA16Point1Degrees() {
1212                return getSofZmanShma(getAlos16Point1Degrees(), getTzais16Point1Degrees());
1213        }
1214
1215        /**
1216         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1217         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1218         * on <em>alos</em> being {@link #getAlos18Degrees() 18&deg;} before {@link #getSunrise() sunrise}. This time is 3
1219         * {@link #getShaahZmanis18Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos18Degrees() dawn}
1220         * based on the opinion of the MGA that the day is calculated from dawn to nightfall with both being 18&deg;
1221         * below sunrise or sunset. This returns the time of 3 * {@link #getShaahZmanis18Degrees()} after
1222         * {@link #getAlos18Degrees() dawn}.
1223         * 
1224         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1225         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1226         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1227         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1228         * @see #getShaahZmanis18Degrees()
1229         * @see #getAlos18Degrees()
1230         */
1231        public Date getSofZmanShmaMGA18Degrees() {
1232                return getSofZmanShma(getAlos18Degrees(), getTzais18Degrees());
1233        }
1234
1235        /**
1236         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1237         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1238         * <em>alos</em> being {@link #getAlos72() 72} minutes before {@link #getSunrise() sunrise}. This time is 3 {@link
1239         * #getShaahZmanis72Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos72() dawn} based on the opinion
1240         * of the MGA that the day is calculated from a {@link #getAlos72() dawn} of 72 minutes before sunrise to
1241         * {@link #getTzais72() nightfall} of 72 minutes after sunset. This returns the time of 3 * {@link
1242         * #getShaahZmanis72Minutes()} after {@link #getAlos72() dawn}. This class returns an identical time to {@link
1243         * #getSofZmanShmaMGA()} and is repeated here for clarity.
1244         * 
1245         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1246         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1247         *         it does not set, a null will be returned. See detailed explanation on top of the
1248         *         {@link AstronomicalCalendar} documentation.
1249         * @see #getShaahZmanis72Minutes()
1250         * @see #getAlos72()
1251         * @see #getSofZmanShmaMGA()
1252         */
1253        public Date getSofZmanShmaMGA72Minutes() {
1254                return getSofZmanShmaMGA();
1255        }
1256
1257        /**
1258         * This method returns the latest <em>zman krias shema</em> (time to recite <em>Shema</em> in the morning) according
1259         * to the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1260         * on <em>alos</em> being {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em>, or 1/10th of the day before
1261         * {@link #getSunrise() sunrise}. This time is 3 {@link #getShaahZmanis90MinutesZmanis() <em>shaos zmaniyos</em>}
1262         * (solar hours) after {@link #getAlos72Zmanis() dawn} based on the opinion of the MGA that the day is calculated
1263         * from a {@link #getAlos72Zmanis() dawn} of 72 minutes <em>zmaniyos</em>, or 1/10th of the day before
1264         * {@link #getSeaLevelSunrise() sea level sunrise} to {@link #getTzais72Zmanis() nightfall} of 72 minutes
1265         * <em>zmaniyos</em> after {@link #getSeaLevelSunset() sea level sunset}. This returns the time of 3 *
1266         * {@link #getShaahZmanis72MinutesZmanis()} after {@link #getAlos72Zmanis() dawn}.
1267         * 
1268         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1269         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1270         *         it does not set, a null will be returned. See detailed explanation on top of the
1271         *         {@link AstronomicalCalendar} documentation.
1272         * @see #getShaahZmanis72MinutesZmanis()
1273         * @see #getAlos72Zmanis()
1274         */
1275        public Date getSofZmanShmaMGA72MinutesZmanis() {
1276                return getSofZmanShma(getAlos72Zmanis(), getTzais72Zmanis());
1277        }
1278
1279        /**
1280         * This method returns the latest <em>zman krias shema</em> (time to recite <em>Shema</em> in the morning) according
1281         * to the opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1282         * <em>alos</em> being {@link #getAlos90() 90} minutes before {@link #getSunrise() sunrise}. This time is 3
1283         * {@link #getShaahZmanis90Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos90() dawn} based on
1284         * the opinion of the MGA that the day is calculated from a {@link #getAlos90() dawn} of 90 minutes before sunrise to
1285         * {@link #getTzais90() nightfall} of 90 minutes after sunset. This returns the time of 3 *
1286         * {@link #getShaahZmanis90Minutes()} after {@link #getAlos90() dawn}.
1287         * 
1288         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1289         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1290         *         it does not set, a null will be returned. See detailed explanation on top of the
1291         *         {@link AstronomicalCalendar} documentation.
1292         * @see #getShaahZmanis90Minutes()
1293         * @see #getAlos90()
1294         */
1295        public Date getSofZmanShmaMGA90Minutes() {
1296                return getSofZmanShma(getAlos90(), getTzais90());
1297        }
1298
1299        /**
1300         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1301         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1302         * on <em>alos</em> being {@link #getAlos90Zmanis() 90} minutes <em>zmaniyos</em> before {@link #getSunrise()
1303         * sunrise}. This time is 3 {@link #getShaahZmanis90MinutesZmanis() <em>shaos zmaniyos</em>} (solar hours) after
1304         * {@link #getAlos90Zmanis() dawn} based on the opinion of the MGA that the day is calculated from a {@link
1305         * #getAlos90Zmanis() dawn} of 90 minutes <em>zmaniyos</em> before sunrise to {@link #getTzais90Zmanis() nightfall}
1306         * of 90 minutes <em>zmaniyos</em> after sunset. This returns the time of 3 * {@link #getShaahZmanis90MinutesZmanis()}
1307         * after {@link #getAlos90Zmanis() dawn}.
1308         * 
1309         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1310         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1311         *         it does not set, a null will be returned. See detailed explanation on top of the
1312         *         {@link AstronomicalCalendar} documentation.
1313         * @see #getShaahZmanis90MinutesZmanis()
1314         * @see #getAlos90Zmanis()
1315         */
1316        public Date getSofZmanShmaMGA90MinutesZmanis() {
1317                return getSofZmanShma(getAlos90Zmanis(), getTzais90Zmanis());
1318        }
1319
1320        /**
1321         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1322         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1323         * on <em>alos</em> being {@link #getAlos96() 96} minutes before {@link #getSunrise() sunrise}. This time is 3
1324         * {@link #getShaahZmanis96Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos96() dawn} based on
1325         * the opinion of the MGA that the day is calculated from a {@link #getAlos96() dawn} of 96 minutes before
1326         * sunrise to {@link #getTzais96() nightfall} of 96 minutes after sunset. This returns the time of 3 * {@link
1327         * #getShaahZmanis96Minutes()} after {@link #getAlos96() dawn}.
1328         * 
1329         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1330         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1331         *         it does not set, a null will be returned. See detailed explanation on top of the
1332         *         {@link AstronomicalCalendar} documentation.
1333         * @see #getShaahZmanis96Minutes()
1334         * @see #getAlos96()
1335         */
1336        public Date getSofZmanShmaMGA96Minutes() {
1337                return getSofZmanShma(getAlos96(), getTzais96());
1338        }
1339
1340        /**
1341         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1342         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1343         * on <em>alos</em> being {@link #getAlos90Zmanis() 96} minutes <em>zmaniyos</em> before {@link #getSunrise()
1344         * sunrise}. This time is 3 {@link #getShaahZmanis96MinutesZmanis() <em>shaos zmaniyos</em>} (solar hours) after
1345         * {@link #getAlos96Zmanis() dawn} based on the opinion of the MGA that the day is calculated from a {@link
1346         * #getAlos96Zmanis() dawn} of 96 minutes <em>zmaniyos</em> before sunrise to {@link #getTzais90Zmanis() nightfall}
1347         * of 96 minutes <em>zmaniyos</em> after sunset. This returns the time of 3 * {@link #getShaahZmanis96MinutesZmanis()}
1348         * after {@link #getAlos96Zmanis() dawn}.
1349         * 
1350         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1351         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1352         *         it does not set, a null will be returned. See detailed explanation on top of the
1353         *         {@link AstronomicalCalendar} documentation.
1354         * @see #getShaahZmanis96MinutesZmanis()
1355         * @see #getAlos96Zmanis()
1356         */
1357        public Date getSofZmanShmaMGA96MinutesZmanis() {
1358                return getSofZmanShma(getAlos96Zmanis(), getTzais96Zmanis());
1359        }
1360
1361        /**
1362         * This method returns the latest <em>zman krias shema</em> (time to recite <em>Shema</em> in the morning) calculated
1363         * as 3 hours (regular clock hours and not <em>sha'os zmaniyos</em>) before {@link ZmanimCalendar#getChatzos()}.
1364         * Generally known as part of the "Komarno" <em>zmanim</em> after <a href=
1365         * "https://en.wikipedia.org/wiki/Komarno_(Hasidic_dynasty)#Rabbi_Yitzchak_Eisik_Safrin">Rav Yitzchak Eizik of
1366         * Komarno</a>, a proponent of this calculation, it actually predates him a lot. It is the opinion of the 
1367         * <em>Shach</em> in the Nekudas Hakesef (Yoreh Deah 184), <a href=
1368         * "https://hebrewbooks.org/pdfpager.aspx?req=21638&st=&pgnum=30">Rav Moshe Lifshitz</a> in his commentary
1369         * <a href="https://hebrewbooks.org/pdfpager.aspx?req=21638&st=&pgnum=50">Lechem Mishneh on Brachos 1:2</a>. It is
1370         * next brought down about 100 years later by the <a href="https://en.wikipedia.org/wiki/Jacob_Emden">Yaavetz</a>
1371         * (in his <em>siddur</em>, <a href="https://hebrewbooks.org/pdfpager.aspx?req=7920&st=&pgnum=6">Mor Uktziah Orach
1372         * Chaim 1</a>, <a href="https://hebrewbooks.org/pdfpager.aspx?req=22309&st=&pgnum=30">Lechem Shamayim, Brachos 1:2</a>
1373         * and <a href="https://hebrewbooks.org/pdfpager.aspx?req=1408&st=&pgnum=69">She'elos Yaavetz vol. 1 no. 40</a>),
1374         * Rav Yitzchak Eizik of Komarno in the Ma'aseh Oreg on Mishnayos Brachos 11:2, Shevus Yaakov, Chasan Sofer and others.
1375         * See Yisrael Vehazmanim <a href="https://hebrewbooks.org/pdfpager.aspx?req=9765&st=&pgnum=83">vol. 1 7:3, page 55 -
1376         * 62</a>. A variant of this calculation {@link #getSofZmanShmaFixedLocal()} uses {@link #getFixedLocalChatzos() fixed
1377         * local <em>chatzos</em>} for calculating this type of <em>zman</em>.
1378         * 
1379         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1380         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1381         *         it does not set, a null will be returned. See detailed explanation on top of the
1382         *         {@link AstronomicalCalendar} documentation.
1383         * @see ZmanimCalendar#getChatzos()
1384         * @see #getSofZmanShmaFixedLocal()
1385         * @see #getSofZmanTfila2HoursBeforeChatzos()
1386         */
1387        public Date getSofZmanShma3HoursBeforeChatzos() {
1388                return getTimeOffset(getChatzos(), -180 * MINUTE_MILLIS);
1389        }
1390
1391        /**
1392         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) according to the
1393         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based
1394         * on <em>alos</em> being {@link #getAlos120() 120} minutes or 1/6th of the day before {@link #getSunrise() sunrise}.
1395         * This time is 3 {@link #getShaahZmanis120Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos120()
1396         * dawn} based on the opinion of the MGA that the day is calculated from a {@link #getAlos120() dawn} of 120 minutes
1397         * before sunrise to {@link #getTzais120() nightfall} of 120 minutes after sunset. This returns the time of 3
1398         * {@link #getShaahZmanis120Minutes()} after {@link #getAlos120() dawn}. This is an extremely early <em>zman</em> that
1399         * is very much a <em>chumra</em>.
1400         * 
1401         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1402         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1403         *         it does not set, a null will be returned. See detailed explanation on top of the
1404         *         {@link AstronomicalCalendar} documentation.
1405         * @see #getShaahZmanis120Minutes()
1406         * @see #getAlos120()
1407         */
1408        public Date getSofZmanShmaMGA120Minutes() {
1409                return getSofZmanShma(getAlos120(), getTzais120());
1410        }
1411
1412        /**
1413         * This method returns the latest <em>zman krias shema</em> (time to recite <em>Shema</em> in the morning) based
1414         * on the opinion that the day starts at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and ends at
1415         * {@link #getSeaLevelSunset() sea level sunset}. This is the opinion of the <a href=
1416         * "https://hebrewbooks.org/40357">\u05D7\u05D9\u05D3\u05D5\u05E9\u05D9
1417         * \u05D5\u05DB\u05DC\u05DC\u05D5\u05EA \u05D4\u05E8\u05D6\u05F4\u05D4</a> and the <a href=
1418         * "https://hebrewbooks.org/14799">\u05DE\u05E0\u05D5\u05E8\u05D4 \u05D4\u05D8\u05D4\u05D5\u05E8\u05D4</a> as
1419         * mentioned by Yisrael Vehazmanim <a href="https://hebrewbooks.org/pdfpager.aspx?req=9765&pgnum=81">vol 1, sec. 7,
1420         * ch. 3 no. 16</a>. Three <em>shaos zmaniyos</em> are calculated based on this day and added to {@link
1421         * #getAlos16Point1Degrees() <em>alos</em>} to reach this time. This time is 3 <em>shaos zmaniyos</em> (solar hours)
1422         * after {@link #getAlos16Point1Degrees() dawn} based on the opinion that the day is calculated from a {@link
1423         * #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} to {@link #getSeaLevelSunset() sea level sunset}.
1424         * <b>Note:</b> Based on this calculation <em>chatzos</em> will not be at midday.
1425         * 
1426         * @return the <code>Date</code> of the latest <em>zman krias shema</em> based on this day. If the calculation can't
1427         *         be computed such as northern and southern locations even south of the Arctic Circle and north of the
1428         *         Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a null
1429         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1430         * @see #getAlos16Point1Degrees()
1431         * @see #getSeaLevelSunset()
1432         */
1433        public Date getSofZmanShmaAlos16Point1ToSunset() {
1434                return getSofZmanShma(getAlos16Point1Degrees(), getElevationAdjustedSunset());
1435        }
1436
1437        /**
1438         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) based on the
1439         * opinion that the day starts at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and ends at
1440         * {@link #getTzaisGeonim7Point083Degrees() <em>tzais</em> 7.083&deg;}. 3 <em>shaos zmaniyos</em> are calculated
1441         * based on this day and added to {@link #getAlos16Point1Degrees() <em>alos</em>} to reach this time. This time is 3
1442         * <em>shaos zmaniyos</em> (temporal hours) after {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} based on
1443         * the opinion that the day is calculated from a {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} to
1444         * {@link #getTzaisGeonim7Point083Degrees() <em>tzais</em> 7.083&deg;}.
1445         * <b>Note: </b> Based on this calculation <em>chatzos</em> will not be at midday.
1446         * 
1447         * @return the <code>Date</code> of the latest <em>zman krias shema</em> based on this calculation. If the
1448         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
1449         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
1450         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
1451         *         documentation.
1452         * @see #getAlos16Point1Degrees()
1453         * @see #getTzaisGeonim7Point083Degrees()
1454         */
1455        public Date getSofZmanShmaAlos16Point1ToTzaisGeonim7Point083Degrees() {
1456                return getSofZmanShma(getAlos16Point1Degrees(), getTzaisGeonim7Point083Degrees());
1457        }
1458
1459        /**
1460         * From the GRA in Kol Eliyahu on Berachos #173 that states that <em>zman krias shema</em> is calculated as half the
1461         * time from {@link #getSeaLevelSunrise() sea level sunrise} to {@link #getFixedLocalChatzos() fixed local chatzos}.
1462         * The GRA himself seems to contradict this when he stated that <em>zman krias shema</em> is 1/4 of the day from
1463         * sunrise to sunset. See <em>Sarah Lamoed</em> #25 in Yisroel Vehazmanim Vol. III page 1016.
1464         * 
1465         * @return the <code>Date</code> of the latest <em>zman krias shema</em> based on this calculation. If the
1466         *         calculation can't be computed such as in the Arctic Circle where there is at least one day a year where
1467         *         the sun does not rise, and one where it does not set, a null will be returned. See detailed explanation
1468         *         on top of the {@link AstronomicalCalendar} documentation.
1469         * @see #getFixedLocalChatzos()
1470         * 
1471         * @deprecated As per a conversation Rabbi Yisroel Twerski had with Rabbi Harfenes, this <em>zman</em> published in
1472         *         the Yisrael Vehazmanim was based on a misunderstanding and should not be used. This deprecated method
1473         *         will be removed (likely in v3.0) pending confirmation from Rabbi Harfenes.
1474         */
1475        @Deprecated // (since="1.3", forRemoval=true) // add back once Java 9 is the minimum supported version
1476        public Date getSofZmanShmaKolEliyahu() {
1477                Date chatzos = getFixedLocalChatzos();
1478                if (chatzos == null || getSunrise() == null) {
1479                        return null;
1480                }
1481                long diff = (chatzos.getTime() - getElevationAdjustedSunrise().getTime()) / 2;
1482                return getTimeOffset(chatzos, -diff);
1483        }
1484
1485        /**
1486         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1487         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1488         * <em>alos</em> being {@link #getAlos19Point8Degrees() 19.8&deg;} before {@link #getSunrise() sunrise}. This time
1489         * is 4 {@link #getShaahZmanis19Point8Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link
1490         * #getAlos19Point8Degrees() dawn} based on the opinion of the MGA that the day is calculated from dawn to
1491         * nightfall with both being 19.8&deg; below sunrise or sunset. This returns the time of 4 * {@link
1492         * #getShaahZmanis19Point8Degrees()} after {@link #getAlos19Point8Degrees() dawn}.
1493         * 
1494         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1495         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1496         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1497         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1498         * 
1499         * @see #getShaahZmanis19Point8Degrees()
1500         * @see #getAlos19Point8Degrees()
1501         */
1502        public Date getSofZmanTfilaMGA19Point8Degrees() {
1503                return getSofZmanTfila(getAlos19Point8Degrees(), getTzais19Point8Degrees());
1504        }
1505
1506        /**
1507         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1508         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1509         * <em>alos</em> being {@link #getAlos16Point1Degrees() 16.1&deg;} before {@link #getSunrise() sunrise}. This time
1510         * is 4 {@link #getShaahZmanis16Point1Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link
1511         * #getAlos16Point1Degrees() dawn} based on the opinion of the MGA that the day is calculated from dawn to
1512         * nightfall with both being 16.1&deg; below sunrise or sunset. This returns the time of 4 * {@link
1513         * #getShaahZmanis16Point1Degrees()} after {@link #getAlos16Point1Degrees() dawn}.
1514         * 
1515         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1516         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1517         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1518         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1519         * 
1520         * @see #getShaahZmanis16Point1Degrees()
1521         * @see #getAlos16Point1Degrees()
1522         */
1523        public Date getSofZmanTfilaMGA16Point1Degrees() {
1524                return getSofZmanTfila(getAlos16Point1Degrees(), getTzais16Point1Degrees());
1525        }
1526
1527        /**
1528         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1529         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1530         * <em>alos</em> being {@link #getAlos18Degrees() 18&deg;} before {@link #getSunrise() sunrise}. This time is 4
1531         * {@link #getShaahZmanis18Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos18Degrees() dawn}
1532         * based on the opinion of the MGA that the day is calculated from dawn to nightfall with both being 18&deg;
1533         * below sunrise or sunset. This returns the time of 4 * {@link #getShaahZmanis18Degrees()} after
1534         * {@link #getAlos18Degrees() dawn}.
1535         * 
1536         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1537         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1538         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1539         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1540         * 
1541         * @see #getShaahZmanis18Degrees()
1542         * @see #getAlos18Degrees()
1543         */
1544        public Date getSofZmanTfilaMGA18Degrees() {
1545                return getSofZmanTfila(getAlos18Degrees(), getTzais18Degrees());
1546        }
1547
1548        /**
1549         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1550         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1551         * <em>alos</em> being {@link #getAlos72() 72} minutes before {@link #getSunrise() sunrise}. This time is 4
1552         * {@link #getShaahZmanis72Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos72() dawn} based on
1553         * the opinion of the MGA that the day is calculated from a {@link #getAlos72() dawn} of 72 minutes before
1554         * sunrise to {@link #getTzais72() nightfall} of 72 minutes after sunset. This returns the time of 4 *
1555         * {@link #getShaahZmanis72Minutes()} after {@link #getAlos72() dawn}. This class returns an identical time to
1556         * {@link #getSofZmanTfilaMGA()} and is repeated here for clarity.
1557         * 
1558         * @return the <code>Date</code> of the latest <em>zman tfila</em>. If the calculation can't be computed such as in
1559         *         the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1560         *         does not set, a null will be returned. See detailed explanation on top of the
1561         *         {@link AstronomicalCalendar} documentation.
1562         * @see #getShaahZmanis72Minutes()
1563         * @see #getAlos72()
1564         * @see #getSofZmanShmaMGA()
1565         */
1566        public Date getSofZmanTfilaMGA72Minutes() {
1567                return getSofZmanTfilaMGA();
1568        }
1569
1570        /**
1571         * This method returns the latest <em>zman tfila</em> (time to the morning prayers) according to the opinion of the
1572         * <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
1573         * being {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This time is 4
1574         * {@link #getShaahZmanis72MinutesZmanis() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos72Zmanis() dawn}
1575         * based on the opinion of the MGA that the day is calculated from a {@link #getAlos72Zmanis() dawn} of 72
1576         * minutes <em>zmaniyos</em> before sunrise to {@link #getTzais72Zmanis() nightfall} of 72 minutes <em>zmaniyos</em>
1577         * after sunset. This returns the time of 4 * {@link #getShaahZmanis72MinutesZmanis()} after {@link #getAlos72Zmanis() dawn}.
1578         * 
1579         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1580         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1581         *         it does not set, a null will be returned. See detailed explanation on top of the
1582         *         {@link AstronomicalCalendar} documentation.
1583         * @see #getShaahZmanis72MinutesZmanis()
1584         * @see #getAlos72Zmanis()
1585         */
1586        public Date getSofZmanTfilaMGA72MinutesZmanis() {
1587                return getSofZmanTfila(getAlos72Zmanis(), getTzais72Zmanis());
1588        }
1589
1590        /**
1591         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1592         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1593         * <em>alos</em> being {@link #getAlos90() 90} minutes before {@link #getSunrise() sunrise}. This time is 4
1594         * {@link #getShaahZmanis90Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos90() dawn} based on
1595         * the opinion of the MGA that the day is calculated from a {@link #getAlos90() dawn} of 90 minutes before sunrise to
1596         * {@link #getTzais90() nightfall} of 90 minutes after sunset. This returns the time of 4 *
1597         * {@link #getShaahZmanis90Minutes()} after {@link #getAlos90() dawn}.
1598         * 
1599         * @return the <code>Date</code> of the latest <em>zman tfila</em>. If the calculation can't be computed such as in
1600         *         the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1601         *         does not set, a null will be returned. See detailed explanation on top of the
1602         *         {@link AstronomicalCalendar} documentation.
1603         * @see #getShaahZmanis90Minutes()
1604         * @see #getAlos90()
1605         */
1606        public Date getSofZmanTfilaMGA90Minutes() {
1607                return getSofZmanTfila(getAlos90(), getTzais90());
1608        }
1609
1610        /**
1611         * This method returns the latest <em>zman tfila</em> (time to the morning prayers) according to the opinion of the
1612         * <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
1613         * being {@link #getAlos90Zmanis() 90} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This time is
1614         * 4 {@link #getShaahZmanis90MinutesZmanis() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos90Zmanis()
1615         * dawn} based on the opinion of the MGA that the day is calculated from a {@link #getAlos90Zmanis() dawn}
1616         * of 90 minutes <em>zmaniyos</em> before sunrise to {@link #getTzais90Zmanis() nightfall} of 90 minutes
1617         * <em>zmaniyos</em> after sunset. This returns the time of 4 * {@link #getShaahZmanis90MinutesZmanis()} after
1618         * {@link #getAlos90Zmanis() dawn}.
1619         * 
1620         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1621         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1622         *         it does not set, a null will be returned. See detailed explanation on top of the
1623         *         {@link AstronomicalCalendar} documentation.
1624         * @see #getShaahZmanis90MinutesZmanis()
1625         * @see #getAlos90Zmanis()
1626         */
1627        public Date getSofZmanTfilaMGA90MinutesZmanis() {
1628                return getSofZmanTfila(getAlos90Zmanis(), getTzais90Zmanis());
1629        }
1630
1631        /**
1632         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1633         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1634         * <em>alos</em> being {@link #getAlos96() 96} minutes before {@link #getSunrise() sunrise}. This time is 4
1635         * {@link #getShaahZmanis96Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos96() dawn} based on
1636         * the opinion of the MGA that the day is calculated from a {@link #getAlos96() dawn} of 96 minutes before
1637         * sunrise to {@link #getTzais96() nightfall} of 96 minutes after sunset. This returns the time of 4 *
1638         * {@link #getShaahZmanis96Minutes()} after {@link #getAlos96() dawn}.
1639         * 
1640         * @return the <code>Date</code> of the latest <em>zman tfila</em>. If the calculation can't be computed such as in
1641         *         the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1642         *         does not set, a null will be returned. See detailed explanation on top of the
1643         *         {@link AstronomicalCalendar} documentation.
1644         * @see #getShaahZmanis96Minutes()
1645         * @see #getAlos96()
1646         */
1647        public Date getSofZmanTfilaMGA96Minutes() {
1648                return getSofZmanTfila(getAlos96(), getTzais96());
1649        }
1650
1651        /**
1652         * This method returns the latest <em>zman tfila</em> (time to the morning prayers) according to the opinion of the
1653         * <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
1654         * being {@link #getAlos96Zmanis() 96} minutes <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This time is
1655         * 4 {@link #getShaahZmanis96MinutesZmanis() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos96Zmanis()
1656         * dawn} based on the opinion of the MGA that the day is calculated from a {@link #getAlos96Zmanis() dawn}
1657         * of 96 minutes <em>zmaniyos</em> before sunrise to {@link #getTzais96Zmanis() nightfall} of 96 minutes
1658         * <em>zmaniyos</em> after sunset. This returns the time of 4 * {@link #getShaahZmanis96MinutesZmanis()} after
1659         * {@link #getAlos96Zmanis() dawn}.
1660         * 
1661         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1662         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1663         *         it does not set, a null will be returned. See detailed explanation on top of the
1664         *         {@link AstronomicalCalendar} documentation.
1665         * @see #getShaahZmanis90MinutesZmanis()
1666         * @see #getAlos90Zmanis()
1667         */
1668        public Date getSofZmanTfilaMGA96MinutesZmanis() {
1669                return getSofZmanTfila(getAlos96Zmanis(), getTzais96Zmanis());
1670        }
1671
1672        /**
1673         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) according to the opinion
1674         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on
1675         * <em>alos</em> being {@link #getAlos120() 120} minutes before {@link #getSunrise() sunrise} . This time is 4
1676         * {@link #getShaahZmanis120Minutes() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos120() dawn}
1677         * based on the opinion of the MGA that the day is calculated from a {@link #getAlos120() dawn} of 120
1678         * minutes before sunrise to {@link #getTzais120() nightfall} of 120 minutes after sunset. This returns the time of
1679         * 4 * {@link #getShaahZmanis120Minutes()} after {@link #getAlos120() dawn}. This is an extremely early <em>zman</em>
1680         * that is very much a <em>chumra</em>.
1681         * 
1682         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1683         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1684         *         it does not set, a null will be returned. See detailed explanation on top of the
1685         *         {@link AstronomicalCalendar} documentation.
1686         * @see #getShaahZmanis120Minutes()
1687         * @see #getAlos120()
1688         */
1689        public Date getSofZmanTfilaMGA120Minutes() {
1690                return getSofZmanTfila(getAlos120(), getTzais120());
1691        }
1692
1693        /**
1694         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) calculated as 2 hours
1695         * before {@link ZmanimCalendar#getChatzos()}. This is based on the opinions that calculate
1696         * <em>sof zman krias shema</em> as {@link #getSofZmanShma3HoursBeforeChatzos()}. This returns the time of 2 hours
1697         * before {@link ZmanimCalendar#getChatzos()}.
1698         * 
1699         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
1700         *         as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where
1701         *         it does not set, a null will be returned. See detailed explanation on top of the
1702         *         {@link AstronomicalCalendar} documentation.
1703         * @see ZmanimCalendar#getChatzos()
1704         * @see #getSofZmanShma3HoursBeforeChatzos()
1705         */
1706        public Date getSofZmanTfila2HoursBeforeChatzos() {
1707                return getTimeOffset(getChatzos(), -120 * MINUTE_MILLIS);
1708        }
1709
1710        /**
1711         * This method returns <em>mincha gedola</em> calculated as 30 minutes after {@link #getChatzos() <em>chatzos</em>}
1712         * and not 1/2 of a {@link #getShaahZmanisGra() <em>shaah zmanis</em>} after {@link #getChatzos() <em>chatzos</em>} as
1713         * calculated by {@link #getMinchaGedola}. Some use this time to delay the start of <em>mincha</em> in the winter when
1714         * 1/2 of a {@link #getShaahZmanisGra() <em>shaah zmanis</em>} is less than 30 minutes. See
1715         * {@link #getMinchaGedolaGreaterThan30()} for a convenience method that returns the later of the 2 calculations. One
1716         * should not use this time to start <em>mincha</em> before the standard {@link #getMinchaGedola() <em>mincha gedola</em>}.
1717         * See Shulchan Aruch <a href="https://hebrewbooks.org/pdfpager.aspx?req=49624&st=&pgnum=291">Orach Chayim 234:1</a> and
1718         * the Shaar Hatziyon <em>seif katan ches</em>.
1719         * 
1720         * @return the <code>Date</code> of 30 minutes after <em>chatzos</em>. If the calculation can't be computed such as
1721         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1722         *         does not set, a null will be returned. See detailed explanation on top of the
1723         *         {@link AstronomicalCalendar} documentation.
1724         * @see #getMinchaGedola()
1725         * @see #getMinchaGedolaGreaterThan30()
1726         */
1727        public Date getMinchaGedola30Minutes() {
1728                return getTimeOffset(getChatzos(), MINUTE_MILLIS * 30);
1729        }
1730
1731        /**
1732         * This method returns the time of <em>mincha gedola</em> according to the Magen Avraham with the day starting 72
1733         * minutes before sunrise and ending 72 minutes after sunset. This is the earliest time to pray <em>mincha</em>. For
1734         * more information on this see the documentation on {@link #getMinchaGedola() <em>mincha gedola</em>}. This is
1735         * calculated as 6.5 {@link #getTemporalHour() solar hours} after <em>alos</em>. The calculation used is 6.5 *
1736         * {@link #getShaahZmanis72Minutes()} after {@link #getAlos72() <em>alos</em>}.
1737         * 
1738         * @see #getAlos72()
1739         * @see #getMinchaGedola()
1740         * @see #getMinchaKetana()
1741         * @see ZmanimCalendar#getMinchaGedola()
1742         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
1743         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1744         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
1745         *         documentation.
1746         */
1747        public Date getMinchaGedola72Minutes() {
1748                return getMinchaGedola(getAlos72(), getTzais72());
1749        }
1750
1751        /**
1752         * This method returns the time of <em>mincha gedola</em> according to the Magen Avraham with the day starting and
1753         * ending 16.1&deg; below the horizon. This is the earliest time to pray <em>mincha</em>. For more information on
1754         * this see the documentation on {@link #getMinchaGedola() <em>mincha gedola</em>}. This is calculated as 6.5
1755         * {@link #getTemporalHour() solar hours} after <em>alos</em>. The calculation used is 6.5 *
1756         * {@link #getShaahZmanis16Point1Degrees()} after {@link #getAlos16Point1Degrees() <em>alos</em>}.
1757         * 
1758         * @see #getShaahZmanis16Point1Degrees()
1759         * @see #getMinchaGedola()
1760         * @see #getMinchaKetana()
1761         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
1762         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
1763         *         the sun  may not reach low enough below the horizon for this calculation, a null will be returned. See
1764         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1765         */
1766        public Date getMinchaGedola16Point1Degrees() {
1767                return getMinchaGedola(getAlos16Point1Degrees(), getTzais16Point1Degrees());
1768        }
1769
1770        /**
1771         * This is a convenience method that returns the later of {@link #getMinchaGedola()} and
1772         * {@link #getMinchaGedola30Minutes()}. In the winter when 1/2 of a {@link #getShaahZmanisGra() <em>shaah zmanis</em>} is
1773         * less than 30 minutes {@link #getMinchaGedola30Minutes()} will be returned, otherwise {@link #getMinchaGedola()}
1774         * will be returned.
1775         * 
1776         * @return the <code>Date</code> of the later of {@link #getMinchaGedola()} and {@link #getMinchaGedola30Minutes()}.
1777         *         If the calculation can't be computed such as in the Arctic Circle where there is at least one day a year
1778         *         where the sun does not rise, and one where it does not set, a null will be returned. See detailed
1779         *         explanation on top of the {@link AstronomicalCalendar} documentation.
1780         */
1781        public Date getMinchaGedolaGreaterThan30() {
1782                if (getMinchaGedola30Minutes() == null || getMinchaGedola() == null) {
1783                        return null;
1784                } else {
1785                        return getMinchaGedola30Minutes().compareTo(getMinchaGedola()) > 0 ? getMinchaGedola30Minutes()
1786                                        : getMinchaGedola();
1787                }
1788        }
1789
1790        /**
1791         * This method returns the time of <em>mincha ketana</em> according to the Magen Avraham with the day starting and
1792         * ending 16.1&deg; below the horizon. This is the preferred earliest time to pray <em>mincha</em> according to the
1793         * opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> and others. For more information on
1794         * this see the documentation on {@link #getMinchaGedola() <em>mincha gedola</em>}. This is calculated as 9.5
1795         * {@link #getTemporalHour() solar hours} after <em>alos</em>. The calculation used is 9.5 *
1796         * {@link #getShaahZmanis16Point1Degrees()} after {@link #getAlos16Point1Degrees() <em>alos</em>}.
1797         * 
1798         * @see #getShaahZmanis16Point1Degrees()
1799         * @see #getMinchaGedola()
1800         * @see #getMinchaKetana()
1801         * @return the <code>Date</code> of the time of <em>mincha ketana</em>. If the calculation can't be computed such
1802         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
1803         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
1804         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1805         */
1806        public Date getMinchaKetana16Point1Degrees() {
1807                return getMinchaKetana(getAlos16Point1Degrees(), getTzais16Point1Degrees());
1808        }
1809
1810        /**
1811         * This method returns the time of <em>mincha ketana</em> according to the Magen Avraham with the day
1812         * starting 72 minutes before sunrise and ending 72 minutes after sunset. This is the preferred earliest time to pray
1813         * <em>mincha</em> according to the opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a>
1814         * and others. For more information on this see the documentation on {@link #getMinchaGedola() <em>mincha gedola</em>}.
1815         * This is calculated as 9.5 {@link #getShaahZmanis72Minutes()} after <em>alos</em>. The calculation used is 9.5 *
1816         * {@link #getShaahZmanis72Minutes()} after {@link #getAlos72() <em>alos</em>}.
1817         * 
1818         * @see #getShaahZmanis16Point1Degrees()
1819         * @see #getMinchaGedola()
1820         * @see #getMinchaKetana()
1821         * @return the <code>Date</code> of the time of <em>mincha ketana</em>. If the calculation can't be computed such as
1822         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1823         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
1824         *         documentation.
1825         */
1826        public Date getMinchaKetana72Minutes() {
1827                return getMinchaKetana(getAlos72(), getTzais72());
1828        }
1829
1830        /**
1831         * This method returns the time of <em>plag hamincha</em> according to the Magen Avraham with the day starting 60
1832         * minutes before sunrise and ending 60 minutes after sunset. This is calculated as 10.75 hours after
1833         * {@link #getAlos60() dawn}. The formula used is 10.75 {@link #getShaahZmanis60Minutes()} after {@link #getAlos60()}.
1834         * 
1835         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1836         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1837         *         does not set, a null will be returned. See detailed explanation on top of the
1838         *         {@link AstronomicalCalendar} documentation.
1839         * 
1840         * @see #getShaahZmanis60Minutes()
1841         * @see #getAlos60()
1842         * @see #getTzais60()
1843         */
1844        public Date getPlagHamincha60Minutes() {
1845                return getPlagHamincha(getAlos60(), getTzais60());
1846        }
1847
1848        /**
1849         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> according to the
1850         * Magen Avraham with the day starting 72 minutes before sunrise and ending 72 minutes after sunset. This is calculated
1851         * as 10.75 hours after {@link #getAlos72() dawn}. The formula used is 10.75 {@link #getShaahZmanis72Minutes()} after
1852         * {@link #getAlos72()}. Since <em>plag</em> by this calculation can occur after sunset, it should only be used
1853         * <em>lechumra</em>.
1854         * 
1855         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1856         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
1857         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1858         * 
1859         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1860         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1861         *         does not set, a null will be returned. See detailed explanation on top of the
1862         *         {@link AstronomicalCalendar} documentation.
1863         * 
1864         * @see #getShaahZmanis72Minutes()
1865         */
1866        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1867        public Date getPlagHamincha72Minutes() {
1868                return getPlagHamincha(getAlos72(), getTzais72());
1869        }
1870
1871        /**
1872         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> according to the
1873         * Magen Avraham with the day starting 90 minutes before sunrise and ending 90 minutes after sunset. This is calculated
1874         * as 10.75 hours after {@link #getAlos90() dawn}. The formula used is 10.75 {@link #getShaahZmanis90Minutes()} after
1875         * {@link #getAlos90()}. Since <em>plag</em> by this calculation can occur after sunset, it should only be used
1876         * <em>lechumra</em>.
1877         * 
1878         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1879         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
1880         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1881         * 
1882         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1883         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1884         *         does not set, a null will be returned. See detailed explanation on top of the
1885         *         {@link AstronomicalCalendar} documentation.
1886         * 
1887         * @see #getShaahZmanis90Minutes()
1888         */
1889        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1890        public Date getPlagHamincha90Minutes() {
1891                return getPlagHamincha(getAlos90(), getTzais90());
1892        }
1893
1894        /**
1895         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> according to the Magen
1896         * Avraham with the day starting 96 minutes before sunrise and ending 96 minutes after sunset. This is calculated as 10.75
1897         * hours after {@link #getAlos96() dawn}. The formula used is 10.75 {@link #getShaahZmanis96Minutes()} after
1898         * {@link #getAlos96()}. Since <em>plag</em> by this calculation can occur after sunset, it should only be used
1899         * <em>lechumra</em>.
1900         * 
1901         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1902         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
1903         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1904         * 
1905         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1906         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1907         *         does not set, a null will be returned. See detailed explanation on top of the
1908         *         {@link AstronomicalCalendar} documentation.
1909         * @see #getShaahZmanis96Minutes()
1910         */
1911        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1912        public Date getPlagHamincha96Minutes() {
1913                return getPlagHamincha(getAlos96(), getTzais96());
1914        }
1915
1916        /**
1917         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em>. This is calculated
1918         * as 10.75 hours after {@link #getAlos96Zmanis() dawn}. The formula used is 10.75 * {@link
1919         * #getShaahZmanis96MinutesZmanis()} after {@link #getAlos96Zmanis() dawn}. Since <em>plag</em> by this calculation can
1920         * occur after sunset, it should only be used <em>lechumra</em>.
1921         * 
1922         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1923         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
1924         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1925         * 
1926         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1927         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1928         *         does not set, a null will be returned. See detailed explanation on top of the
1929         *         {@link AstronomicalCalendar} documentation.
1930         */
1931        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1932        public Date getPlagHamincha96MinutesZmanis() {
1933                return getPlagHamincha(getAlos96Zmanis(), getTzais96Zmanis());
1934        }
1935
1936        /**
1937         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em>. This is calculated
1938         * as 10.75 hours after {@link #getAlos90Zmanis() dawn}. The formula used is 10.75 * {@link
1939         * #getShaahZmanis90MinutesZmanis()} after {@link #getAlos90Zmanis() dawn}. Since <em>plag</em> by this calculation can
1940         * occur after sunset, it should only be used <em>lechumra</em>.
1941         * 
1942         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1943         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc.There is no current plan to remove this
1944         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1945         * 
1946         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1947         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1948         *         does not set, a null will be returned. See detailed explanation on top of the
1949         *         {@link AstronomicalCalendar} documentation.
1950         */
1951        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1952        public Date getPlagHamincha90MinutesZmanis() {
1953                return getPlagHamincha(getAlos90Zmanis(), getTzais90Zmanis());
1954        }
1955
1956        /**
1957         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em>. This is calculated as
1958         * 10.75 hours after {@link #getAlos72Zmanis()}. The formula used is 10.75 * {@link #getShaahZmanis72MinutesZmanis()} after
1959         * {@link #getAlos72Zmanis() dawn}. Since <em>plag</em> by this calculation can occur after sunset, it should only be used
1960         * <em>lechumra</em>.
1961         * 
1962         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1963         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
1964         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1965         * 
1966         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1967         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
1968         *         does not set, a null will be returned. See detailed explanation on top of the
1969         *         {@link AstronomicalCalendar} documentation.
1970         */
1971        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1972        public Date getPlagHamincha72MinutesZmanis() {
1973                return getPlagHamincha(getAlos72Zmanis(), getTzais72Zmanis());
1974        }
1975
1976        /**
1977         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> based on the
1978         * opinion that the day starts at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and ends at {@link
1979         * #getTzais16Point1Degrees() <em>tzais</em> 16.1&deg;}. This is calculated as 10.75 hours <em>zmaniyos</em>
1980         * after {@link #getAlos16Point1Degrees() dawn}. The formula used is 10.75 * {@link #getShaahZmanis16Point1Degrees()}
1981         * after {@link #getAlos16Point1Degrees()}. Since <em>plag</em> by this calculation can occur after sunset, it
1982         * should only be used <em>lechumra</em>.
1983         * 
1984         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
1985         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
1986         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
1987         * 
1988         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
1989         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
1990         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
1991         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
1992         * 
1993         * @see #getShaahZmanis16Point1Degrees()
1994         */
1995        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
1996        public Date getPlagHamincha16Point1Degrees() {
1997                return getPlagHamincha(getAlos16Point1Degrees(), getTzais16Point1Degrees());
1998        }
1999
2000        /**
2001         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> based on the
2002         * opinion that the day starts at {@link #getAlos19Point8Degrees() <em>alos</em> 19.8&deg;} and ends at {@link
2003         * #getTzais19Point8Degrees() <em>tzais</em> 19.8&deg;}. This is calculated as 10.75 hours <em>zmaniyos</em>
2004         * after {@link #getAlos19Point8Degrees() dawn}. The formula used is 10.75 * {@link
2005         * #getShaahZmanis19Point8Degrees()} after {@link #getAlos19Point8Degrees()}. Since <em>plag</em> by this
2006         * calculation can occur after sunset, it should only be used <em>lechumra</em>.
2007         * 
2008         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2009         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2010         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2011         * 
2012         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
2013         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
2014         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
2015         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2016         * 
2017         * @see #getShaahZmanis19Point8Degrees()
2018         */
2019        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2020        public Date getPlagHamincha19Point8Degrees() {
2021                return getPlagHamincha(getAlos19Point8Degrees(), getTzais19Point8Degrees());
2022        }
2023
2024        /**
2025         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> based on the
2026         * opinion that the day starts at {@link #getAlos26Degrees() <em>alos</em> 26&deg;} and ends at {@link
2027         * #getTzais26Degrees() <em>tzais</em> 26&deg;}. This is calculated as 10.75 hours <em>zmaniyos</em> after {@link
2028         * #getAlos26Degrees() dawn}. The formula used is 10.75 * {@link #getShaahZmanis26Degrees()} after {@link
2029         * #getAlos26Degrees()}. Since the <em>zman</em> based on an extremely early <em>alos</em> and a very late
2030         * <em>tzais</em>, it should only be used <em>lechumra</em>.
2031         * 
2032         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2033         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2034         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2035         * 
2036         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
2037         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
2038         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
2039         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2040         * 
2041         * @see #getShaahZmanis26Degrees()
2042         * @see #getPlagHamincha120Minutes()
2043         */
2044        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2045        public Date getPlagHamincha26Degrees() {
2046                return getPlagHamincha(getAlos26Degrees(), getTzais26Degrees());
2047        }
2048
2049        /**
2050         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> based on the
2051         * opinion that the day starts at {@link #getAlos18Degrees() <em>alos</em> 18&deg;} and ends at {@link
2052         * #getTzais18Degrees() <em>tzais</em> 18&deg;}. This is calculated as 10.75 hours <em>zmaniyos</em> after {@link
2053         * #getAlos18Degrees() dawn}. The formula used is 10.75 * {@link #getShaahZmanis18Degrees()} after {@link
2054         * #getAlos18Degrees()}. Since <em>plag</em> by this calculation can occur after sunset, it should only be used
2055         * <em>lechumra</em>.
2056         * 
2057         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2058         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2059         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2060         * 
2061         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
2062         *         northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
2063         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
2064         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2065         * 
2066         * @see #getShaahZmanis18Degrees()
2067         */
2068        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2069        public Date getPlagHamincha18Degrees() {
2070                return getPlagHamincha(getAlos18Degrees(), getTzais18Degrees());
2071        }
2072
2073        /**
2074         * This method should be used <em>lechumra</em> only and returns the time of <em>plag hamincha</em> based on the opinion
2075         * that the day starts at {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and ends at {@link #getSunset() sunset}.
2076         * 10.75 <em>shaos zmaniyos</em> are calculated based on this day and added to {@link #getAlos16Point1Degrees()
2077         * <em>alos</em>} to reach this time. This time is 10.75 <em>shaos zmaniyos</em> (temporal hours) after {@link
2078         * #getAlos16Point1Degrees() dawn} based on the opinion that the day is calculated from a {@link #getAlos16Point1Degrees()
2079         * dawn} of 16.1 degrees before sunrise to {@link #getSeaLevelSunset() sea level sunset}. This returns the time of 10.75 *
2080         * the calculated <em>shaah zmanis</em> after {@link #getAlos16Point1Degrees() dawn}. Since <em>plag</em> by this
2081         * calculation can occur after sunset, it should only be used <em>lechumra</em>.
2082         * 
2083         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2084         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2085         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2086         * 
2087         * @return the <code>Date</code> of the <em>plag</em>. If the calculation can't be computed such as northern and southern
2088         *         locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not reach
2089         *         low enough below the horizon for this calculation, a null will be returned. See detailed explanation on
2090         *         top of the {@link AstronomicalCalendar} documentation.
2091         * 
2092         * @see #getAlos16Point1Degrees()
2093         * @see #getSeaLevelSunset()
2094         */
2095        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2096        public Date getPlagAlosToSunset() {
2097                return getPlagHamincha(getAlos16Point1Degrees(), getElevationAdjustedSunset());
2098        }
2099
2100        /**
2101         * This method returns the time of <em>plag hamincha</em> based on the opinion that the day starts at
2102         * {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;} and ends at {@link #getTzaisGeonim7Point083Degrees()
2103         * <em>tzais</em>}. 10.75 <em>shaos zmaniyos</em> are calculated based on this day and added to {@link
2104         * #getAlos16Point1Degrees() <em>alos</em>} to reach this time. This time is 10.75 <em>shaos zmaniyos</em> (temporal
2105         * hours) after {@link #getAlos16Point1Degrees() dawn} based on the opinion that the day is calculated from a
2106         * {@link #getAlos16Point1Degrees() dawn} of 16.1 degrees before sunrise to
2107         * {@link #getTzaisGeonim7Point083Degrees() <em>tzais</em>} . This returns the time of 10.75 * the calculated
2108         * <em>shaah zmanis</em> after {@link #getAlos16Point1Degrees() dawn}.
2109         * 
2110         * @return the <code>Date</code> of the <em>plag</em>. If the calculation can't be computed such as northern and
2111         *         southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not
2112         *         reach low enough below the horizon for this calculation, a null will be returned. See detailed explanation
2113         *         on top of the {@link AstronomicalCalendar} documentation.
2114         * 
2115         * @see #getAlos16Point1Degrees()
2116         * @see #getTzaisGeonim7Point083Degrees()
2117         */
2118        public Date getPlagAlos16Point1ToTzaisGeonim7Point083Degrees() {
2119                return getPlagHamincha(getAlos16Point1Degrees(), getTzaisGeonim7Point083Degrees());
2120        }
2121
2122        /**
2123         * Method to return the beginning of <em>bain hashmashos</em> of Rabbeinu Tam calculated when the sun is
2124         * {@link #ZENITH_13_POINT_24 13.24&deg;} below the western {@link #GEOMETRIC_ZENITH geometric horizon} (90&deg;)
2125         * after sunset. This calculation is based on the same calculation of {@link #getBainHasmashosRT58Point5Minutes()
2126         * <em>bain hashmashos</em> Rabbeinu Tam 58.5 minutes} but uses a degree based calculation instead of 58.5 exact
2127         * minutes. This calculation is based on the position of the sun 58.5 minutes after sunset in Jerusalem <a href=
2128         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
2129         * which calculates to 13.24&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}.
2130         * NOTE: As per Yisrael Vehazmanim Vol. III page 1028, No. 50, a dip of slightly less than 13&deg; should be used.
2131         * Calculations show that the proper dip to be 13.2456&deg; (truncated to 13.24 that provides about 1.5 second
2132         * earlier (<em>lechumra</em>) time) below the horizon at that time. This makes a difference of 1 minute and 10
2133         * seconds in Jerusalem during the Equinox, and 1 minute 29 seconds during the solstice as compared to the proper
2134         * 13.24&deg; versus 13&deg;. For NY during the solstice, the difference is 1 minute 56 seconds.
2135         * @todo recalculate the above based on equilux/equinox calculations.
2136         * 
2137         * @return the <code>Date</code> of the sun being 13.24&deg; below {@link #GEOMETRIC_ZENITH geometric zenith}
2138         *         (90&deg;). If the calculation can't be computed such as northern and southern locations even south of the
2139         *         Arctic Circle and north of the Antarctic Circle where the sun may not reach low enough below the horizon
2140         *         for this calculation, a null will be returned. See detailed explanation on top of the
2141         *         {@link AstronomicalCalendar} documentation.
2142         * 
2143         * @see #ZENITH_13_POINT_24
2144         * @see #getBainHasmashosRT58Point5Minutes()
2145         */
2146        public Date getBainHasmashosRT13Point24Degrees() {
2147                return getSunsetOffsetByDegrees(ZENITH_13_POINT_24);
2148        }
2149
2150        /**
2151         * This method returns the beginning of <em>Bain hashmashos</em> of Rabbeinu Tam calculated as a 58.5
2152         * minute offset after sunset. <em>bain hashmashos</em> is 3/4 of a <em>Mil</em> before <em>tzais</em> or 3 1/4
2153         * <em>Mil</em> after sunset. With a <em>Mil</em> calculated as 18 minutes, 3.25 * 18 = 58.5 minutes.
2154         * 
2155         * @return the <code>Date</code> of 58.5 minutes after sunset. If the calculation can't be computed such as in the
2156         *         Arctic Circle where there is at least one day a year where the sun does not rise, and one where it does
2157         *         not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2158         *         documentation.
2159         * 
2160         */
2161        public Date getBainHasmashosRT58Point5Minutes() {
2162                return getTimeOffset(getElevationAdjustedSunset(), 58.5 * MINUTE_MILLIS);
2163        }
2164
2165        /**
2166         * This method returns the beginning of <em>bain hashmashos</em> based on the calculation of 13.5 minutes (3/4 of an
2167         * 18 minute <em>Mil</em>) before <em>shkiah</em> calculated as {@link #getTzaisGeonim7Point083Degrees() 7.083&deg;}.
2168         * 
2169         * @return the <code>Date</code> of the <em>bain hashmashos</em> of Rabbeinu Tam in this calculation. If the
2170         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
2171         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
2172         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2173         *         documentation.
2174         * @see #getTzaisGeonim7Point083Degrees()
2175         */
2176        public Date getBainHasmashosRT13Point5MinutesBefore7Point083Degrees() {
2177                return getTimeOffset(getSunsetOffsetByDegrees(ZENITH_7_POINT_083), -13.5 * MINUTE_MILLIS);
2178        }
2179
2180        /**
2181         * This method returns the beginning of <em>bain hashmashos</em> of Rabbeinu Tam calculated according to the
2182         * opinion of the <em>Divrei Yosef</em> (see Yisrael Vehazmanim) calculated 5/18th (27.77%) of the time between
2183         * <em>alos</em> (calculated as 19.8&deg; before sunrise) and sunrise. This is added to sunset to arrive at the time
2184         * for <em>bain hashmashos</em> of Rabbeinu Tam.
2185         * 
2186         * @return the <code>Date</code> of <em>bain hashmashos</em> of Rabbeinu Tam for this calculation. If the
2187         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
2188         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
2189         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2190         *         documentation.
2191         */
2192        public Date getBainHasmashosRT2Stars() {
2193                Date alos19Point8 = getAlos19Point8Degrees();
2194                Date sunrise = getElevationAdjustedSunrise();
2195                if (alos19Point8 == null || sunrise == null) {
2196                        return null;
2197                }
2198
2199                return getTimeOffset(getElevationAdjustedSunset(), (sunrise.getTime() - alos19Point8.getTime()) * (5 / 18d));
2200        }
2201        
2202        /**
2203         * This method returns the beginning of <em>bain hashmashos</em> (twilight) according to the <a href=
2204         * "https://en.wikipedia.org/wiki/Eliezer_ben_Samuel">Yereim (Rabbi Eliezer of Metz)</a> calculated as 18 minutes
2205         * or 3/4 of a 24 minute <em>Mil</em> before sunset. According to the Yereim, <em>bain hashmashos</em> starts 3/4
2206         * of a <em>Mil</em> before sunset and <em>tzais</em> or nightfall starts at sunset. 
2207         * 
2208         * @return the <code>Date</code> of 18 minutes before sunset. If the calculation can't be computed such as in the
2209         *         Arctic Circle where there is at least one day a year where the sun does not rise, and one where it does
2210         *         not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2211         *         documentation.
2212         * @see #getBainHasmashosYereim3Point05Degrees()
2213         */
2214        public Date getBainHasmashosYereim18Minutes() {
2215                return getTimeOffset(getElevationAdjustedSunset(), -18 * MINUTE_MILLIS);
2216        }
2217        
2218        /**
2219         * This method returns the beginning of <em>bain hashmashos</em> (twilight) according to the <a href=
2220         * "https://en.wikipedia.org/wiki/Eliezer_ben_Samuel">Yereim (Rabbi Eliezer of Metz)</a> calculated as the sun's
2221         * position 3.05&deg; above the horizon <a href=
2222         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
2223         * its position 18 minutes or 3/4 of an 24 minute <em>mil</em> before sunset. According to the Yereim, <em>bain
2224         * hashmashos</em> starts 3/4 of a <em>Mil</em> before sunset and <em>tzais</em> or nightfall starts at sunset.
2225         * Note that <em>lechumra</em> (of about 14 seconds) a refraction value of 0.5166&deg; as opposed to the traditional
2226         * 0.566&deg; is used. This is more inline with the actual refraction in <em>Eretz Yisrael</em> and is brought down
2227         * by <a href=
2228         * "http://beinenu.com/rabbis/%D7%94%D7%A8%D7%91-%D7%99%D7%93%D7%99%D7%93%D7%99%D7%94-%D7%9E%D7%A0%D7%AA">Rabbi
2229         * Yedidya Manet</a> in his <a href="https://www.nli.org.il/en/books/NNL_ALEPH002542826/NLI">Zmanei Halacha
2230         * Lema’aseh</a> (p. 11). That is the first source that I am aware of that calculates degree-based Yereim
2231         * <em>zmanim</em>. The 0.5166&deg; refraction is also used by the <a href="https://zmanim.online/">Luach Itim
2232         * Lebinah</a>. Calculating the Yereim's <em>bain hashmashos</em> using 18 minute based degrees is also suggested
2233         * in the upcoming 8th edition of the zmanim Kehilchasam. For more details, see the article <a href=
2234         * "https://kosherjava.com/2020/12/07/the-yereims-bein-hashmashos/">The Yereim’s <em>Bein Hashmashos</em></a>.
2235         * 
2236         * @todo recalculate based on equinox/equilux
2237         * @return the <code>Date</code> of the sun's position 3.05&deg; minutes before sunset. If the calculation can't
2238         *         be computed such as in the Arctic Circle where there is at least one day a year where the sun does not
2239         *         rise, and one where it does not set, a null will be returned. See detailed explanation on top of the
2240         *         {@link AstronomicalCalendar} documentation.
2241         * 
2242         * @see #ZENITH_MINUS_3_POINT_05
2243         * @see #getBainHasmashosYereim18Minutes()
2244         * @see #getBainHasmashosYereim2Point8Degrees()
2245         * @see #getBainHasmashosYereim2Point1Degrees()
2246         */
2247        public Date getBainHasmashosYereim3Point05Degrees() {
2248                return getSunsetOffsetByDegrees(ZENITH_MINUS_3_POINT_05);
2249        }
2250        
2251        /**
2252         * This method returns the beginning of <em>bain hashmashos</em> (twilight) according to the <a href=
2253         * "https://en.wikipedia.org/wiki/Eliezer_ben_Samuel">Yereim (Rabbi Eliezer of Metz)</a> calculated as 16.875
2254         * minutes or 3/4 of a 22.5 minute <em>Mil</em> before sunset. According to the Yereim, <em>bain hashmashos</em>
2255         * starts 3/4 of a <em>Mil</em> before sunset and <em>tzais</em> or nightfall starts at sunset. 
2256         * 
2257         * @return the <code>Date</code> of 16.875 minutes before sunset. If the calculation can't be computed such as in the
2258         *         Arctic Circle where there is at least one day a year where the sun does not rise, and one where it does
2259         *         not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2260         *         documentation.
2261         * 
2262         * @see #getBainHasmashosYereim2Point8Degrees()
2263         */
2264        public Date getBainHasmashosYereim16Point875Minutes() {
2265                return getTimeOffset(getElevationAdjustedSunset(), -16.875 * MINUTE_MILLIS);
2266        }
2267        
2268        /**
2269         * This method returns the beginning of <em>bain hashmashos</em> (twilight) according to the <a href=
2270         * "https://en.wikipedia.org/wiki/Eliezer_ben_Samuel">Yereim (Rabbi Eliezer of Metz)</a> calculated as the sun's
2271         * position 2.8&deg; above the horizon <a href=
2272         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>,
2273         * its position 16.875 minutes or 3/4 of an 18 minute <em>Mil</em> before sunset. According to the Yereim, <em>bain
2274         * hashmashos</em> starts 3/4 of a <em>Mil</em> before sunset and <em>tzais</em> or nightfall starts at sunset.
2275         * Details, including how the degrees were calculated can be seen in the documentation of
2276         * {@link #getBainHasmashosYereim3Point05Degrees()}.
2277         * 
2278         * @return the <code>Date</code> of the sun's position 2.8&deg; minutes before sunset. If the calculation can't
2279         *         be computed such as in the Arctic Circle where there is at least one day a year where the sun does not
2280         *         rise, and one where it does not set, a null will be returned. See detailed explanation on top of the
2281         *         {@link AstronomicalCalendar} documentation.
2282         * 
2283         * @see #ZENITH_MINUS_2_POINT_8
2284         * @see #getBainHasmashosYereim16Point875Minutes()
2285         * @see #getBainHasmashosYereim3Point05Degrees()
2286         * @see #getBainHasmashosYereim2Point1Degrees()
2287         */
2288        public Date getBainHasmashosYereim2Point8Degrees() {
2289                return getSunsetOffsetByDegrees(ZENITH_MINUS_2_POINT_8);
2290        }
2291        
2292        /**
2293         * This method returns the beginning of <em>bain hashmashos</em> (twilight) according to the <a href=
2294         * "https://en.wikipedia.org/wiki/Eliezer_ben_Samuel">Yereim (Rabbi Eliezer of Metz)</a> calculated as 13.5 minutes
2295         * or 3/4 of an 18 minute <em>Mil</em> before sunset. According to the Yereim, <em>bain hashmashos</em> starts 3/4 of
2296         * a <em>Mil</em> before sunset and <em>tzais</em> or nightfall starts at sunset. 
2297         * 
2298         * @return the <code>Date</code> of 13.5 minutes before sunset. If the calculation can't be computed such as in the
2299         *         Arctic Circle where there is at least one day a year where the sun does not rise, and one where it does
2300         *         not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2301         *         documentation.
2302         * 
2303         * @see #getBainHasmashosYereim2Point1Degrees()
2304         */
2305        public Date getBainHasmashosYereim13Point5Minutes() {
2306                return getTimeOffset(getElevationAdjustedSunset(), -13.5 * MINUTE_MILLIS);
2307        }
2308        
2309        /**
2310         * This method returns the beginning of <em>bain hashmashos</em> according to the <a href=
2311         * "https://en.wikipedia.org/wiki/Eliezer_ben_Samuel">Yereim (Rabbi Eliezer of Metz)</a> calculated as the sun's
2312         * position 2.1&deg; above the horizon <a href=
2313         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> in
2314         * Yerushalayim, its position 13.5 minutes or 3/4 of an 18 minute <em>Mil</em> before sunset. According to the Yereim,
2315         * <em>bain hashmashos</em> starts 3/4 of a <em>mil</em> before sunset and <em>tzais</em> or nightfall starts at sunset.
2316         * Details, including how the degrees were calculated can be seen in the documentation of
2317         * {@link #getBainHasmashosYereim3Point05Degrees()}.
2318         * 
2319         * @return the <code>Date</code> of the sun's position 2.1&deg; minutes before sunset. If the calculation can't
2320         *         be computed such as in the Arctic Circle where there is at least one day a year where the sun does not
2321         *         rise, and one where it does not set, a null will be returned. See detailed explanation on top of the
2322         *         {@link AstronomicalCalendar} documentation.
2323         * 
2324         * @see #ZENITH_MINUS_2_POINT_1
2325         * @see #getBainHasmashosYereim13Point5Minutes()
2326         * @see #getBainHasmashosYereim2Point8Degrees()
2327         * @see #getBainHasmashosYereim3Point05Degrees()
2328         */
2329        public Date getBainHasmashosYereim2Point1Degrees() {
2330                return getSunsetOffsetByDegrees(ZENITH_MINUS_2_POINT_1);
2331        }
2332        
2333        /**
2334         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated at the
2335         * sun's position at {@link #ZENITH_3_POINT_7 3.7&deg;} below the western horizon.
2336         * 
2337         * @return the <code>Date</code> representing the time when the sun is 3.7&deg; below sea level.
2338         * @see #ZENITH_3_POINT_7
2339         */
2340        public Date getTzaisGeonim3Point7Degrees() {
2341                return getSunsetOffsetByDegrees(ZENITH_3_POINT_7);
2342        }
2343
2344        /**
2345         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated at the
2346         * sun's position at {@link #ZENITH_3_POINT_8 3.8&deg;} below the western horizon.
2347         * 
2348         * @return the <code>Date</code> representing the time when the sun is 3.8&deg; below sea level.
2349         * @see #ZENITH_3_POINT_8
2350         */
2351        public Date getTzaisGeonim3Point8Degrees() {
2352                return getSunsetOffsetByDegrees(ZENITH_3_POINT_8);
2353        }
2354
2355        /**
2356         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated at the
2357         * sun's position at {@link #ZENITH_5_POINT_95 5.95&deg;} below the western horizon.
2358         * 
2359         * @return the <code>Date</code> representing the time when the sun is 5.95&deg; below sea level. If the calculation
2360         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2361         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2362         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2363         * @see #ZENITH_5_POINT_95
2364         */
2365        public Date getTzaisGeonim5Point95Degrees() {
2366                return getSunsetOffsetByDegrees(ZENITH_5_POINT_95);
2367        }
2368
2369        /**
2370         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 3/4
2371         * of a <a href= "https://en.wikipedia.org/wiki/Biblical_and_Talmudic_units_of_measurement" >Mil</a> based on an 18
2372         * minute Mil, or 13.5 minutes. It is the sun's position at {@link #ZENITH_3_POINT_65 3.65&deg;} below the western
2373         * horizon. This is a very early <em>zman</em> and should not be relied on without Rabbinical guidance.
2374         * 
2375         * @return the <code>Date</code> representing the time when the sun is 3.65&deg; below sea level. If the calculation
2376         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2377         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2378         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2379         * @see #ZENITH_3_POINT_65
2380         */
2381        public Date getTzaisGeonim3Point65Degrees() {
2382                return getSunsetOffsetByDegrees(ZENITH_3_POINT_65);
2383        }
2384
2385        /**
2386         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 3/4
2387         * of a <a href= "https://en.wikipedia.org/wiki/Biblical_and_Talmudic_units_of_measurement" >Mil</a> based on an 18
2388         * minute Mil, or 13.5 minutes. It is the sun's position at {@link #ZENITH_3_POINT_676 3.676&deg;} below the western
2389         * horizon based on the calculations of Stanley Fishkind. This is a very early <em>zman</em> and should not be
2390         * relied on without Rabbinical guidance.
2391         * 
2392         * @return the <code>Date</code> representing the time when the sun is 3.676&deg; below sea level. If the
2393         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
2394         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
2395         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2396         *         documentation.
2397         * @see #ZENITH_3_POINT_676
2398         */
2399        public Date getTzaisGeonim3Point676Degrees() {
2400                return getSunsetOffsetByDegrees(ZENITH_3_POINT_676);
2401        }
2402
2403        /**
2404         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 3/4
2405         * of a <em><a href= "https://en.wikipedia.org/wiki/Biblical_and_Talmudic_units_of_measurement" >mil</a></em> based
2406         * on a 24 minute Mil, or 18 minutes. It is the sun's position at {@link #ZENITH_4_POINT_61 4.61&deg;} below the
2407         * western horizon. This is a very early <em>zman</em> and should not be relied on without Rabbinical guidance.
2408         * 
2409         * @return the <code>Date</code> representing the time when the sun is 4.61&deg; below sea level. If the calculation
2410         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2411         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2412         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2413         * @see #ZENITH_4_POINT_61
2414         */
2415        public Date getTzaisGeonim4Point61Degrees() {
2416                return getSunsetOffsetByDegrees(ZENITH_4_POINT_61);
2417        }
2418
2419        /**
2420         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 3/4
2421         * of a <a href= "https://en.wikipedia.org/wiki/Biblical_and_Talmudic_units_of_measurement" >Mil</a>, based on a 22.5
2422         * minute Mil, or 16 7/8 minutes. It is the sun's position at {@link #ZENITH_4_POINT_37 4.37&deg;} below the western
2423         * horizon. This is a very early <em>zman</em> and should not be relied on without Rabbinical guidance.
2424         * 
2425         * @return the <code>Date</code> representing the time when the sun is 4.37&deg; below sea level. If the calculation
2426         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2427         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2428         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2429         * @see #ZENITH_4_POINT_37
2430         */
2431        public Date getTzaisGeonim4Point37Degrees() {
2432                return getSunsetOffsetByDegrees(ZENITH_4_POINT_37);
2433        }
2434
2435        /**
2436         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 3/4
2437         * of a 24 minute <em><a href= "https://en.wikipedia.org/wiki/Biblical_and_Talmudic_units_of_measurement" >Mil</a></em>,
2438         * based on a <em>Mil</em> being 24 minutes, and is calculated as 18 + 2 + 4 for a total of 24 minutes. It is the
2439         * sun's position at {@link #ZENITH_5_POINT_88 5.88&deg;} below the western horizon. This is a very early
2440         * <em>zman</em> and should not be relied on without Rabbinical guidance.
2441         * 
2442         * @todo Additional detailed documentation needed.
2443         * @return the <code>Date</code> representing the time when the sun is 5.88&deg; below sea level. If the calculation
2444         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2445         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2446         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2447         * @see #ZENITH_5_POINT_88
2448         */
2449        public Date getTzaisGeonim5Point88Degrees() {
2450                return getSunsetOffsetByDegrees(ZENITH_5_POINT_88);
2451        }
2452
2453        /**
2454         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 3/4
2455         * of a <a href= "https://en.wikipedia.org/wiki/Biblical_and_Talmudic_units_of_measurement" >Mil</a> based on the
2456         * sun's position at {@link #ZENITH_4_POINT_8 4.8&deg;} below the western horizon. This is based on Rabbi Leo Levi's
2457         * calculations. This is the This is a very early <em>zman</em> and should not be relied on without Rabbinical guidance.
2458         * @todo Additional documentation needed.
2459         * 
2460         * @return the <code>Date</code> representing the time when the sun is 4.8&deg; below sea level. If the calculation
2461         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2462         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2463         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2464         * @see #ZENITH_4_POINT_8
2465         */
2466        public Date getTzaisGeonim4Point8Degrees() {
2467                return getSunsetOffsetByDegrees(ZENITH_4_POINT_8);
2468        }
2469        
2470        
2471        /**
2472         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> as calculated by
2473         * <a href="https://en.wikipedia.org/wiki/Yechiel_Michel_Tucazinsky">Rabbi Yechiel Michel Tucazinsky</a>. It is
2474         * based on of the position of the sun no later than {@link #getTzaisGeonim6Point45Degrees() 31 minutes} after sunset
2475         * in Jerusalem the height of the summer solstice and is 28 minutes after <em>shkiah</em> <a href=
2476         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>. This
2477         * computes to 6.45&deg; below the western horizon.
2478         * @todo Additional documentation details needed.
2479         * 
2480         * @return the <code>Date</code> representing the time when the sun is 6.45&deg; below sea level. If the
2481         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
2482         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
2483         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2484         *         documentation.
2485         * @see #ZENITH_6_POINT_45
2486         */
2487        public Date getTzaisGeonim6Point45Degrees() {
2488                return getSunsetOffsetByDegrees(ZENITH_6_POINT_45);
2489        }
2490
2491        /**
2492         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated when the
2493         * sun's position {@link #ZENITH_7_POINT_083 7.083&deg; (or 7&deg; 5\u2032}) below the western horizon. This is often
2494         * referred to as 7&deg;5' or 7&deg; and 5 minutes. This calculation is based on the observation of 3 medium sized
2495         * stars by Dr. Baruch (Berthold) Cohn in his <em>luach</em> <a href=
2496         * "https://sammlungen.ub.uni-frankfurt.de/freimann/content/titleinfo/983088">Tabellen enthaltend die Zeitangaben für
2497         * den Beginn der Nacht und des Tages für die Breitengrade + 66 bis -38</a> published in Strasbourg, France in 1899.
2498         * This calendar was very popular in Europe, and many other calendars based their time on it. <a href=
2499         * "https://en.wikipedia.org/wiki/David_Zvi_Hoffmann">Rav Dovid Tzvi Hoffman</a> in his
2500         * <a href="https://hebrewbooks.org/1053">Sh"Ut Melamed Leho'il</a> in an exchange of letters with Baruch Cohn in <a href=
2501         * "https://hebrewbooks.org/pdfpager.aspx?req=1053&st=&pgnum=37">Orach Chaim 30</a> agreed to this <em>zman</em> (page 36),
2502         * as did the Sh"Ut Bnei Tziyon and the Tenuvas Sadeh. It is very close to the time of the <a href=
2503         * "https://hebrewbooks.org/22044">Mekor Chesed</a> of the Sefer chasidim. It is close to the position of the sun 30 minutes
2504         * after sunset in Jerusalem <a href=
2505         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, but not
2506         * Exactly. The actual position of the sun 30 minutes after sunset in Jerusalem at the equilux is 7.205&deg; and 7.199&deg;
2507         * at the equinox. See Hazmanim Bahalacha vol 2, pages 520-521 for more details.
2508         * 
2509         * @return the <code>Date</code> representing the time when the sun is 7.083&deg; below sea level. If the
2510         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
2511         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
2512         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2513         *         documentation.
2514         * @see #ZENITH_7_POINT_083
2515         */
2516        public Date getTzaisGeonim7Point083Degrees() {
2517                return getSunsetOffsetByDegrees(ZENITH_7_POINT_083);
2518        }
2519        
2520        /**
2521         * This method returns <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 45 minutes
2522         * after sunset during the summer solstice in New York, when the <em>neshef</em> (twilight) is the longest. The sun's
2523         * position at this time computes to {@link #ZENITH_7_POINT_67 7.75&deg;} below the western horizon. See <a href=
2524         * "https://hebrewbooks.org/pdfpager.aspx?req=921&pgnum=149">Igros Moshe Even Haezer 4, Ch. 4</a> (regarding
2525         * <em>tzais</em> for <em>krias Shema</em>). It is also mentioned in Rabbi Heber's <a href=
2526         * "https://hebrewbooks.org/53000">Shaarei Zmanim</a> on in
2527         * <a href="https://hebrewbooks.org/pdfpager.aspx?req=53055&pgnum=101">chapter 10 (page 87)</a> and
2528         * <a href="https://hebrewbooks.org/pdfpager.aspx?req=53055&pgnum=122">chapter 12 (page 108)</a>. Also see the
2529         * time of 45 minutes in <a href="https://en.wikipedia.org/wiki/Simcha_Bunim_Cohen">Rabbi Simcha Bunim Cohen's</a> <a
2530         * href="https://www.worldcat.org/oclc/179728985">The radiance of Shabbos</a> as the earliest <em>zman</em> for New York.
2531         * This <em>zman</em> is also listed in the <a href="https://hebrewbooks.org/pdfpager.aspx?req=1927&pgnum=90">Divrei
2532         * Shalom Vol. III, chapter 75</a>, and <a href="https://hebrewbooks.org/pdfpager.aspx?req=892&pgnum=431">Bais Av"i
2533         * Vol. III, chapter 117</a>. This <em>zman</em> is also listed in the Divrei Shalom etc. chapter 177 (FIXME - could not
2534         * be located). Since this <em>zman</em> depends on the level of light, Rabbi Yaakov Shakow presented this degree based
2535         * calculation to Rabbi <a href="https://en.wikipedia.org/wiki/Shmuel_Kamenetsky">Rabbi Shmuel Kamenetsky</a> who agreed
2536         * to it.
2537         * @todo add hyperlinks to source of Divrei Shalom.
2538         * @return the <code>Date</code> representing the time when the sun is 7.67&deg; below sea level. If the
2539         *         calculation can't be computed such as northern and southern locations even south of the Arctic Circle and
2540         *         north of the Antarctic Circle where the sun may not reach low enough below the horizon for this
2541         *         calculation, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2542         *         documentation.
2543         * @see #ZENITH_7_POINT_67
2544         */
2545        public Date getTzaisGeonim7Point67Degrees() {
2546                return getSunsetOffsetByDegrees(ZENITH_7_POINT_67);
2547        }
2548
2549        /**
2550         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated at the
2551         * sun's position at {@link #ZENITH_8_POINT_5 8.5&deg;} below the western horizon.
2552         * 
2553         * @return the <code>Date</code> representing the time when the sun is 8.5&deg; below sea level. If the calculation
2554         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2555         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2556         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2557         * @see #ZENITH_8_POINT_5
2558         */
2559        public Date getTzaisGeonim8Point5Degrees() {
2560                return getSunsetOffsetByDegrees(ZENITH_8_POINT_5);
2561        }
2562        
2563        /**
2564         * This method returns the <em>tzais</em> (nightfall) based on the calculations used in the <a href=
2565         * "https://www.worldcat.org/oclc/243303103">Luach Itim Lebinah</a> as the stringent time for <em>tzais</em>.  It is
2566         * calculated at the sun's position at {@link #ZENITH_9_POINT_3 9.3&deg;} below the western horizon.
2567         * 
2568         * @return the <code>Date</code> representing the time when the sun is 9.3&deg; below sea level. If the calculation
2569         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2570         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2571         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2572         */
2573        public Date getTzaisGeonim9Point3Degrees() {
2574                return getSunsetOffsetByDegrees(ZENITH_9_POINT_3);
2575        }
2576        
2577        /**
2578         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <em>Geonim</em> calculated as 60
2579         * minutes after sunset <a href=
2580         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a>, the
2581         * day that a solar hour is 60 minutes in New York. The sun's position at this time computes to
2582         * {@link #ZENITH_9_POINT_75 9.75&deg;} below the western horizon. This is the opinion of <a href=
2583         * "https://en.wikipedia.org/wiki/Yosef_Eliyahu_Henkin">Rabbi Eliyahu Henkin</a>.  This also follows the opinion of
2584         * <a href="https://en.wikipedia.org/wiki/Shmuel_Kamenetsky">Rabbi Shmuel Kamenetsky</a>. Rabbi Yaakov Shakow presented
2585         * these degree based times to Rabbi Shmuel Kamenetsky who agreed to them.
2586         * 
2587         * @todo recalculate based on equinox / equilux.
2588         * @return the <code>Date</code> representing the time when the sun is 9.75&deg; below sea level. If the calculation
2589         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of
2590         *         the Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a
2591         *         null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2592         *
2593         * @see #getTzais60()
2594         */
2595        public Date getTzaisGeonim9Point75Degrees() {
2596                return getSunsetOffsetByDegrees(ZENITH_9_POINT_75);
2597        }
2598
2599        /**
2600         * This method returns the <em>tzais</em> (nightfall) based on the opinion of the <a href=
2601         * "https://en.wikipedia.org/wiki/Yair_Bacharach">Chavas Yair</a> and <a href=
2602         * "https://he.wikipedia.org/wiki/%D7%9E%D7%9C%D7%9B%D7%99%D7%90%D7%9C_%D7%A6%D7%91%D7%99_%D7%98%D7%A0%D7%A0%D7%91%D7%95%D7%99%D7%9D"
2603         * >Divrei Malkiel</a> that the time to walk the distance of a <em>Mil</em> is 15 minutes for a total of 60 minutes
2604         * for 4 <em>Mil</em> after {@link #getSeaLevelSunset() sea level sunset}. See detailed documentation explaining the
2605         * 60 minute concept at {@link #getAlos60()}.
2606         * 
2607         * @return the <code>Date</code> representing 60 minutes after sea level sunset. If the calculation can't be
2608         *         computed such as in the Arctic Circle where there is at least one day a year where the sun does not rise,
2609         *         and one where it does not set, a null will be returned. See detailed explanation on top of the
2610         *         {@link AstronomicalCalendar} documentation.
2611         * 
2612         * @see #getAlos60()
2613         * @see #getPlagHamincha60Minutes()
2614         * @see #getShaahZmanis60Minutes()
2615         */
2616        public Date getTzais60() {
2617                return getTimeOffset(getElevationAdjustedSunset(), 60 * MINUTE_MILLIS);
2618        }
2619
2620        /**
2621         * This method returns <em>tzais</em> usually calculated as 40 minutes (configurable to any offset via
2622         * {@link #setAteretTorahSunsetOffset(double)}) after sunset. Please note that <em>Chacham</em> Yosef Harari-Raful
2623         * of Yeshivat Ateret Torah who uses this time, does so only for calculating various other <em>zmanai hayom</em>
2624         * such as <em>Sof Zman Krias Shema</em> and <em>Plag Hamincha</em>. His calendars do not publish a <em>zman</em>
2625         * for <em>Tzais</em>. It should also be noted that <em>Chacham</em> Harari-Raful provided a 25 minute <em>zman</em>
2626         * for Israel. This API uses 40 minutes year round in any place on the globe by default. This offset can be change
2627         *  by calling {@link #setAteretTorahSunsetOffset(double)}.
2628         * 
2629         * @return the <code>Date</code> representing 40 minutes (configurable via {@link #setAteretTorahSunsetOffset})
2630         *         after sea level sunset. If the calculation can't be computed such as in the Arctic Circle where there is
2631         *         at least one day a year where the sun does not rise, and one where it does not set, a null will be
2632         *         returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2633         * @see #getAteretTorahSunsetOffset()
2634         * @see #setAteretTorahSunsetOffset(double)
2635         */
2636        public Date getTzaisAteretTorah() {
2637                return getTimeOffset(getElevationAdjustedSunset(), getAteretTorahSunsetOffset() * MINUTE_MILLIS);
2638        }
2639
2640        /**
2641         * Returns the offset in minutes after sunset used to calculate <em>tzais</em> based on the calculations of
2642         * <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah calculations. The default value is 40 minutes.
2643         * This affects most <em>zmanim</em>, since almost all zmanim use subset as part of their calculation.
2644         * 
2645         * @return the number of minutes after sunset for <em>Tzait</em>.
2646         * @see #setAteretTorahSunsetOffset(double)
2647         */
2648        public double getAteretTorahSunsetOffset() {
2649                return ateretTorahSunsetOffset;
2650        }
2651
2652        /**
2653         * Allows setting the offset in minutes after sunset for the Ateret Torah <em>zmanim</em>. The default if unset is
2654         * 40 minutes. <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah uses 40 minutes globally with the exception
2655         * of Israel where a 25 minute offset is used. This 40 minute (or any other) offset can be overridden by this method.
2656         * This offset impacts all Ateret Torah <em>zmanim</em>.
2657         * 
2658         * @param ateretTorahSunsetOffset
2659         *            the number of minutes after sunset to use as an offset for the Ateret Torah <em>tzais</em>
2660         * @see #getAteretTorahSunsetOffset()
2661         */
2662        public void setAteretTorahSunsetOffset(double ateretTorahSunsetOffset) {
2663                this.ateretTorahSunsetOffset = ateretTorahSunsetOffset;
2664        }
2665
2666        /**
2667         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) based on the
2668         * calculation of <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah, that the day starts
2669         * {@link #getAlos72Zmanis() 1/10th of the day} before sunrise and is usually calculated as ending
2670         * {@link #getTzaisAteretTorah() 40 minutes after sunset} (configurable to any offset via
2671         * {@link #setAteretTorahSunsetOffset(double)}). <em>shaos zmaniyos</em> are calculated based on this day and added
2672         * to {@link #getAlos72Zmanis() <em>alos</em>} to reach this time. This time is 3
2673         * {@link #getShaahZmanisAteretTorah() <em>shaos zmaniyos</em>} (temporal hours) after
2674         * {@link #getAlos72Zmanis() <em>alos</em> 72 <em>zmaniyos</em>}. <b>Note: </b> Based on this calculation <em>chatzos</em>
2675         * will not be at midday.
2676         * 
2677         * @return the <code>Date</code> of the latest <em>zman krias shema</em> based on this calculation. If the
2678         *         calculation can't be computed such as in the Arctic Circle where there is at least one day a year where
2679         *         the sun does not rise, and one where it does not set, a null will be returned. See detailed explanation
2680         *         on top of the {@link AstronomicalCalendar} documentation.
2681         * @see #getAlos72Zmanis()
2682         * @see #getTzaisAteretTorah()
2683         * @see #getAteretTorahSunsetOffset()
2684         * @see #setAteretTorahSunsetOffset(double)
2685         * @see #getShaahZmanisAteretTorah()
2686         */
2687        public Date getSofZmanShmaAteretTorah() {
2688                return getSofZmanShma(getAlos72Zmanis(), getTzaisAteretTorah());
2689        }
2690
2691        /**
2692         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) based on the calculation
2693         * of <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah, that the day starts {@link #getAlos72Zmanis()
2694         * 1/10th of the day} before sunrise and is usually calculated as ending {@link #getTzaisAteretTorah() 40 minutes
2695         * after sunset} (configurable to any offset via {@link #setAteretTorahSunsetOffset(double)}). <em>shaos zmaniyos</em>
2696         * are calculated based on this day and added to {@link #getAlos72Zmanis() <em>alos</em>} to reach this time. This time
2697         * is 4 * {@link #getShaahZmanisAteretTorah() <em>shaos zmaniyos</em>} (temporal hours) after
2698         * {@link #getAlos72Zmanis() <em>alos</em> 72 zmaniyos}.
2699         * <b>Note: </b> Based on this calculation <em>chatzos</em> will not be at midday.
2700         * 
2701         * @return the <code>Date</code> of the latest <em>zman krias shema</em> based on this calculation. If the
2702         *         calculation can't be computed such as in the Arctic Circle where there is at least one day a year where
2703         *         the sun does not rise, and one where it does not set, a null will be returned. See detailed explanation
2704         *         on top of the {@link AstronomicalCalendar} documentation.
2705         * @see #getAlos72Zmanis()
2706         * @see #getTzaisAteretTorah()
2707         * @see #getShaahZmanisAteretTorah()
2708         * @see #setAteretTorahSunsetOffset(double)
2709         */
2710        public Date getSofZmanTfilahAteretTorah() {
2711                return getSofZmanTfila(getAlos72Zmanis(), getTzaisAteretTorah());
2712        }
2713
2714        /**
2715         * This method returns the time of <em>mincha gedola</em> based on the calculation of <em>Chacham</em> Yosef
2716         * Harari-Raful of Yeshivat Ateret Torah, that the day starts {@link #getAlos72Zmanis() 1/10th of the day}
2717         * before sunrise and is usually calculated as ending {@link #getTzaisAteretTorah() 40 minutes after sunset}
2718         * (configurable to any offset via {@link #setAteretTorahSunsetOffset(double)}). This is the preferred earliest
2719         * time to pray <em>mincha</em> according to the opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides"
2720         * >Rambam</a> and others. For more information on this see the documentation on {@link #getMinchaGedola() <em>mincha
2721         * gedola</em>}. This is calculated as 6.5 {@link #getShaahZmanisAteretTorah()  solar hours} after <em>alos</em>. The
2722         * calculation used is 6.5 * {@link #getShaahZmanisAteretTorah()} after {@link #getAlos72Zmanis() <em>alos</em>}.
2723         * 
2724         * @see #getAlos72Zmanis()
2725         * @see #getTzaisAteretTorah()
2726         * @see #getShaahZmanisAteretTorah()
2727         * @see #getMinchaGedola()
2728         * @see #getMinchaKetanaAteretTorah()
2729         * @see ZmanimCalendar#getMinchaGedola()
2730         * @see #getAteretTorahSunsetOffset()
2731         * @see #setAteretTorahSunsetOffset(double)
2732         * 
2733         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
2734         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
2735         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2736         *         documentation.
2737         */
2738        public Date getMinchaGedolaAteretTorah() {
2739                return getMinchaGedola(getAlos72Zmanis(), getTzaisAteretTorah());
2740        }
2741
2742        /**
2743         * This method returns the time of <em>mincha ketana</em> based on the calculation of
2744         * <em>Chacham</em> Yosef Harari-Raful of Yeshivat Ateret Torah, that the day starts
2745         * {@link #getAlos72Zmanis() 1/10th of the day} before sunrise and is usually calculated as ending
2746         * {@link #getTzaisAteretTorah() 40 minutes after sunset} (configurable to any offset via
2747         * {@link #setAteretTorahSunsetOffset(double)}). This is the preferred earliest time to pray <em>mincha</em>
2748         * according to the opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> and others.
2749         * For more information on this see the documentation on {@link #getMinchaGedola() <em>mincha gedola</em>}. This is
2750         * calculated as 9.5 {@link #getShaahZmanisAteretTorah() solar hours} after {@link #getAlos72Zmanis() <em>alos</em>}.
2751         * The calculation used is 9.5 * {@link #getShaahZmanisAteretTorah()} after {@link #getAlos72Zmanis() <em>alos</em>}.
2752         * 
2753         * @see #getAlos72Zmanis()
2754         * @see #getTzaisAteretTorah()
2755         * @see #getShaahZmanisAteretTorah()
2756         * @see #getAteretTorahSunsetOffset()
2757         * @see #setAteretTorahSunsetOffset(double)
2758         * @see #getMinchaGedola()
2759         * @see #getMinchaKetana()
2760         * @return the <code>Date</code> of the time of <em>mincha ketana</em>. If the calculation can't be computed such as
2761         *         in theArctic Circle where there is at least one day a year where the sun does not rise, and one where it
2762         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2763         *         documentation.
2764         */
2765        public Date getMinchaKetanaAteretTorah() {
2766                return getMinchaKetana(getAlos72Zmanis(), getTzaisAteretTorah());
2767        }
2768
2769        /**
2770         * This method returns the time of <em>plag hamincha</em> based on the calculation of <em>Chacham</em> Yosef Harari-Raful
2771         * of Yeshivat Ateret Torah, that the day starts {@link #getAlos72Zmanis() 1/10th of the day} before sunrise and is
2772         * usually calculated as ending {@link #getTzaisAteretTorah() 40 minutes after sunset} (configurable to any offset
2773         * via {@link #setAteretTorahSunsetOffset(double)}). <em>shaos zmaniyos</em> are calculated based on this day and
2774         * added to {@link #getAlos72Zmanis() <em>alos</em>} to reach this time. This time is 10.75
2775         * {@link #getShaahZmanisAteretTorah() <em>shaos zmaniyos</em>} (temporal hours) after {@link #getAlos72Zmanis()
2776         * dawn}.
2777         * 
2778         * @return the <code>Date</code> of the <em>plag</em>. If the calculation can't be computed such as in the Arctic Circle
2779         *         where there is at least one day a year where the sun does not rise, and one where it does not set, a null
2780         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2781         * @see #getAlos72Zmanis()
2782         * @see #getTzaisAteretTorah()
2783         * @see #getShaahZmanisAteretTorah()
2784         * @see #setAteretTorahSunsetOffset(double)
2785         * @see #getAteretTorahSunsetOffset()
2786         */
2787        public Date getPlagHaminchaAteretTorah() {
2788                return getPlagHamincha(getAlos72Zmanis(), getTzaisAteretTorah());
2789        }
2790
2791        /**
2792         * This method returns the time of <em>misheyakir</em> based on the common calculation of the Syrian community in NY
2793         * that the <em>alos</em> is a fixed minute offset from day starting {@link #getAlos72Zmanis() 1/10th of the day}
2794         * before sunrise. The common offsets are 6 minutes (based on the <em>Pri Megadim</em>, but not linked to the
2795         * calculation of <em>Alos</em> as 1/10th of the day), 8 and 18 minutes (possibly attributed to
2796         * <a href="https://en.wikipedia.org/wiki/Baruch_Ben_Haim"><em>Chacham</em> Baruch Ben Haim</a>). Since there is no
2797         * universal accepted offset, the user of this API will have to specify one. <em>Chacham</em> Yosef Harari-Raful of
2798         * Yeshivat Ateret Torah does not supply any <em>zman</em> for <em>misheyakir</em> and does not endorse any specific
2799         * calculation for <em>misheyakir</em>. For that reason, this method is not a public method.
2800         * 
2801         * @param minutes
2802         *            the number of minutes after <em>alos</em> calculated as {@link #getAlos72Zmanis() 1/10th of the day}
2803         * @return the <code>Date</code> of <em>misheyakir</em>. If the calculation can't be computed such as in the Arctic
2804         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2805         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2806         *         documentation.
2807         * @see #getAlos72Zmanis()
2808         */
2809        // private Date getMesheyakirAteretTorah(double minutes) {
2810        // return getTimeOffset(getAlos72Zmanis(), minutes * MINUTE_MILLIS);
2811        // }
2812
2813        /**
2814         * Method to return <em>tzais</em> (dusk) calculated as 72 minutes zmaniyos, or 1/10th of the day after
2815         * {@link #getSeaLevelSunset() sea level sunset}. This is the way that the <a href=
2816         * "https://en.wikipedia.org/wiki/Abraham_Cohen_Pimentel">Minchas Cohen</a> in Ma'amar 2:4 calculates Rebbeinu Tam's
2817         * time of <em>tzeis</em>. It should be noted that this calculation results in the shortest time from sunset to
2818         * <em>tzais</em> being during the winter solstice, the longest at the summer solstice and 72 clock minutes at the
2819         * equinox. This does not match reality, since there is no direct relationship between the length of the day and
2820         * twilight. The shortest twilight is during the equinox, the longest is during the the summer solstice, and in the
2821         * winter with the shortest daylight, the twilight period is longer than during the equinoxes.
2822         * 
2823         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2824         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2825         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2826         *         documentation.
2827         * @see #getAlos72Zmanis()
2828         */
2829        public Date getTzais72Zmanis() {
2830                return getZmanisBasedOffset(1.2);
2831        }
2832        
2833        /**
2834         * A utility method to return <em>alos</em> (dawn) or <em>tzais</em> (dusk) based on a fractional day offset. 
2835         * @param hours the number of <em>shaaos zmaniyos</em> (temporal hours) before sunrise or after sunset that defines dawn
2836         *        or dusk. If a negative number is passed in, it will return the time of <em>alos</em> (dawn) (subrtacting the
2837         *        time from sunrise) and if a positive number is passed in, it will return the time of <em>tzais</em> (dusk)
2838         *        (adding the time to sunset). If 0 is passed in, a null will be returned (since we can't tell if it is sunrise
2839         *        or sunset based).
2840         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2841         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2842         *         a null will be returned. A null will also be returned if 0 is passed in, since we can't tell if it is sunrise
2843         *         or sunset based. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
2844         */
2845        private Date getZmanisBasedOffset(double hours) {
2846                long shaahZmanis = getShaahZmanisGra();
2847                if (shaahZmanis == Long.MIN_VALUE || hours == 0) {
2848                        return null;
2849                }
2850
2851                if(hours > 0) {
2852                        return getTimeOffset(getElevationAdjustedSunset(), (long) (shaahZmanis * hours));
2853                } else {
2854                        return getTimeOffset(getElevationAdjustedSunrise(), (long) (shaahZmanis * hours));
2855                }
2856        }
2857
2858        /**
2859         * Method to return <em>tzais</em> (dusk) calculated using 90 minutes zmaniyos or 1/8th of the day after {@link
2860         * #getSeaLevelSunset() sea level sunset}. This time is known in Yiddish as the <em>achtel</em> (an eighth)
2861         * <em>zman</em>.
2862         * 
2863         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2864         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2865         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2866         *         documentation.
2867         * @see #getAlos90Zmanis()
2868         */
2869        public Date getTzais90Zmanis() {
2870                return getZmanisBasedOffset(1.5);
2871        }
2872
2873        /**
2874         * Method to return <em>tzais</em> (dusk) calculated using 96 minutes <em>zmaniyos</em> or 1/7.5 of the day after
2875         * {@link #getSeaLevelSunset() sea level sunset}.
2876         * 
2877         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2878         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2879         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2880         *         documentation.
2881         * @see #getAlos96Zmanis()
2882         */
2883        public Date getTzais96Zmanis() {
2884                return getZmanisBasedOffset(1.6);
2885        }
2886
2887        /**
2888         * Method to return <em>tzais</em> (dusk) calculated as 90 minutes after sea level sunset. This method returns
2889         * <em>tzais</em> (nightfall) based on the opinion of the Magen Avraham that the time to walk the distance of a
2890         * <em>Mil</em> according to the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a>'s opinion
2891         * is 18 minutes for a total of 90 minutes based on the opinion of Ula who calculated <em>tzais</em> as 5
2892         * <em>Mil</em> after sea level <em>shkiah</em> (sunset). A similar calculation {@link #getTzais19Point8Degrees()}
2893         * uses solar position calculations based on this time.
2894         * 
2895         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2896         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2897         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2898         *         documentation.
2899         * @see #getTzais19Point8Degrees()
2900         * @see #getAlos90()
2901         */
2902        public Date getTzais90() {
2903                return getTimeOffset(getElevationAdjustedSunset(), 90 * MINUTE_MILLIS);
2904        }
2905
2906        /**
2907         * This method should be used <em>lechumra</em> only and returns <em>tzais</em> (nightfall) based on the calculations
2908         * of <a href="https://en.wikipedia.org/wiki/Avraham_Chaim_Naeh">Rav Chaim Naeh</a> that the time to walk the
2909         * distance of a <em>Mil</em> according to the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a>'s opinion
2910         * is 2/5 of an hour (24 minutes) for a total of 120 minutes based on the opinion of <em>Ula</em> who calculated
2911         * <em>tzais</em> as 5 <em>Mil</em> after sea level <em>shkiah</em> (sunset). A similar calculation {@link
2912         * #getTzais26Degrees()} uses degree-based calculations based on this 120 minute calculation. Since the <em>zman</em>
2913         * is extremely late and at a point that is long past the 18&deg; point where the darkest point is
2914         * reached, it should only be used <em>lechumra</em>, such as delaying the start of nighttime <em>mitzvos</em>.
2915         * 
2916         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2917         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2918         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2919         * 
2920         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2921         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2922         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}.
2923         *         documentation.
2924         * @see #getTzais26Degrees()
2925         * @see #getAlos120()
2926         */
2927        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2928        public Date getTzais120() {
2929                return getTimeOffset(getElevationAdjustedSunset(), 120 * MINUTE_MILLIS);
2930        }
2931
2932        /**
2933         * This method should be used <em>lechumra</em> only and returns <em>tzais</em> (dusk) calculated using 120 minutes
2934         * <em>zmaniyos</em> after {@link #getSeaLevelSunset() sea level sunset}. Since the <em>zman</em>
2935         * is extremely late and at a point when the it is long past the 18&deg; point where the darkest point is
2936         * reached, it should only be used <em>lechumra</em>, such as delaying the start of nighttime <em>mitzvos</em>.
2937         * 
2938         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2939         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2940         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2941         * 
2942         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
2943         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
2944         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
2945         *         documentation.
2946         * @see #getAlos120Zmanis()
2947         * @see #getTzais120()
2948         * @see #getTzais26Degrees()
2949         */
2950        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2951        public Date getTzais120Zmanis() {
2952                return getZmanisBasedOffset(2.0);
2953        }
2954
2955        /**
2956         * This calculates the time of <em>tzais</em> at the point when the sun is 16.1&deg; below the horizon. This is
2957         * the sun's dip below the horizon 72 minutes after sunset according Rabbeinu Tam's calculation of <em>tzais</em>
2958         * <a href=
2959         * "https://kosherjava.com/2022/01/12/equinox-vs-equilux-zmanim-calculations/">around the equinox / equilux</a> in
2960         * Jerusalem. The question of equinox VS equilux is complex, with Rabbi Meir Posen in the <a href=
2961         * "https://www.worldcat.org/oclc/956316270">Ohr Meir</a> of the opinion that the equilux should be used. See
2962         * Yisrael Vehazmanim vol I, 34:1:4. Rabbi Yedidya Manet in his <a href=
2963         * "https://www.nli.org.il/en/books/NNL_ALEPH002542826/NLI">Zmanei Halacha Lema'aseh</a> (4th edition part 2, pages
2964         * and 22 and 24) and Rabbi Yonah Metzbuch (in a letter published by Rabbi Manet) are of the opinion that the
2965         * astronomical equinox should be used. The difference adds up to about 9 seconds, too trivial to make much of a
2966         * difference. For information on how this is calculated see the comments on {@link #getAlos16Point1Degrees()}.
2967         * 
2968         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as northern and
2969         *         southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may
2970         *         not reach low enough below the horizon for this calculation, a null will be returned. See detailed
2971         *         explanation on top of the {@link AstronomicalCalendar} documentation.
2972         * @see #getTzais72()
2973         * @see #getAlos16Point1Degrees() for more information on this calculation.
2974         */
2975        public Date getTzais16Point1Degrees() {
2976                return getSunsetOffsetByDegrees(ZENITH_16_POINT_1);
2977        }
2978
2979        /**
2980         * This method should be used <em>lechumra</em> only and returns <em>tzais</em> based on when the sun is 26&deg;
2981         * below the horizon.For information on how this is calculated see the comments on {@link #getAlos26Degrees()}.
2982         * Since the <em>zman</em> is extremely late and at a point when it is long past the 18&deg; point where the
2983         * darkest point is reached, it should only be used <em>lechumra</em> such as delaying the start of nighttime
2984         * <em>mitzvos</em>.
2985         * 
2986         * @deprecated This method should be used <em>lechumra</em> only since it returns a very late time, and if used
2987         *         <em>lekula</em> can result in <em>chillul Shabbos</em> etc. There is no current plan to remove this
2988         *         method from the API, and this deprecation is intended to alert developers of the danger of using it.
2989         * 
2990         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as northern and
2991         *         southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may
2992         *         not reach low enough below the horizon for this calculation, a null will be returned. See detailed
2993         *         explanation on top of the {@link AstronomicalCalendar} documentation.
2994         * @see #getTzais120()
2995         * @see #getAlos26Degrees()
2996         */
2997        @Deprecated // (forRemoval=false) // add back once Java 9 is the minimum supported version
2998        public Date getTzais26Degrees() {
2999                return getSunsetOffsetByDegrees(ZENITH_26_DEGREES);
3000        }
3001
3002        /**
3003         * For information on how this is calculated see the comments on {@link #getAlos18Degrees()}
3004         * 
3005         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as northern and
3006         *         southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may
3007         *         not reach low enough below the horizon for this calculation, a null will be returned. See detailed
3008         *         explanation on top of the {@link AstronomicalCalendar} documentation.
3009         * @see #getAlos18Degrees()
3010         */
3011        public Date getTzais18Degrees() {
3012                return getSunsetOffsetByDegrees(ASTRONOMICAL_ZENITH);
3013        }
3014
3015        /**
3016         * For information on how this is calculated see the comments on {@link #getAlos19Point8Degrees()}
3017         * 
3018         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as northern and
3019         *         southern locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may
3020         *         not reach low enough below the horizon for this calculation, a null will be returned. See detailed
3021         *         explanation on top of the {@link AstronomicalCalendar} documentation.
3022         * @see #getTzais90()
3023         * @see #getAlos19Point8Degrees()
3024         */
3025        public Date getTzais19Point8Degrees() {
3026                return getSunsetOffsetByDegrees(ZENITH_19_POINT_8);
3027        }
3028
3029        /**
3030         * A method to return <em>tzais</em> (dusk) calculated as 96 minutes after sea level sunset. For information on how
3031         * this is calculated see the comments on {@link #getAlos96()}.
3032         * 
3033         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
3034         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
3035         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
3036         *         documentation.
3037         * @see #getAlos96()
3038         */
3039        public Date getTzais96() {
3040                return getTimeOffset(getElevationAdjustedSunset(), 96 * MINUTE_MILLIS);
3041        }
3042
3043        /**
3044         * A method that returns the local time for fixed <em>chatzos</em>. This time is noon and midnight adjusted from
3045         * standard time to account for the local latitude. The 360&deg; of the globe divided by 24 calculates to 15&deg;
3046         * per hour with 4 minutes per degree, so at a longitude of 0 , 15, 30 etc... <em>Chatzos</em> is at exactly 12:00
3047         * noon. This is the time of <em>chatzos</em> according to the <a href=
3048         * "https://en.wikipedia.org/wiki/Aruch_HaShulchan">Aruch Hashulchan</a> in <a href=
3049         * "https://hebrewbooks.org/pdfpager.aspx?req=7705&pgnum=426">Orach Chaim 233:14</a> and <a href=
3050         * "https://en.wikipedia.org/wiki/Moshe_Feinstein">Rabbi Moshe Feinstein</a> in Igros Moshe <a href=
3051         * "https://hebrewbooks.org/pdfpager.aspx?req=916&st=&pgnum=67">Orach Chaim 1:24</a> and <a href=
3052         * "https://hebrewbooks.org/pdfpager.aspx?req=14675&pgnum=191">2:20</a>.
3053         * Lakewood, N.J., with a longitude of -74.2094, is 0.7906 away from the closest multiple of 15 at -75&deg;. This
3054         * is multiplied by 4 to yield 3 minutes and 10 seconds for a <em>chatzos</em> of 11:56:50. This method is not tied
3055         * to the theoretical 15&deg; timezones, but will adjust to the actual timezone and <a
3056         * href="https://en.wikipedia.org/wiki/Daylight_saving_time">Daylight saving time</a>.
3057         * 
3058         * @return the Date representing the local <em>chatzos</em>
3059         * @see GeoLocation#getLocalMeanTimeOffset()
3060         */
3061        public Date getFixedLocalChatzos() {
3062                return getTimeOffset(getDateFromTime(12.0 - getGeoLocation().getTimeZone().getRawOffset()
3063                                / (double) HOUR_MILLIS, true), -getGeoLocation().getLocalMeanTimeOffset());
3064        }
3065
3066        /**
3067         * A method that returns the latest <em>zman krias shema</em> (time to recite Shema in the morning) calculated as 3
3068         * clock hours before {@link #getFixedLocalChatzos()}. Note that there are opinions brought down in Yisrael Vehazmanim
3069         * <a href="https://hebrewbooks.org/pdfpager.aspx?req=9765&st=&pgnum=85">page 57</a> and Rav Yitzchal Silber's <a href=
3070         * "https://www.worldcat.org/oclc/811253716">Sha'aos Shavos Balalacha</a> that this calculation is a mistake and regular
3071         * <em>chatzos</em> shoud be used for clock-hour calculations as opposed to fixed local <em>chatzos</em>. According to
3072         * these opinions it should be 3 clock hours before regular <em>chatzos</em> as calculated in {@link
3073         * #getSofZmanShma3HoursBeforeChatzos()}.
3074         * 
3075         * @return the <code>Date</code> of the latest <em>zman krias shema</em> calculated as 3 clock hours before
3076         *         {@link #getFixedLocalChatzos()}.
3077         * @see #getFixedLocalChatzos()
3078         * @see #getSofZmanShma3HoursBeforeChatzos()
3079         * @see #getSofZmanTfilaFixedLocal()
3080         *         
3081         * @deprecated This method of calculating <em>sof zman Shma</em> is considered a mistaken understanding of the proper
3082         *         calculation of this <em>zman</em> in the opinion of Rav Yitzchal Silber's <a href=
3083         *         "https://www.worldcat.org/oclc/811253716">Sha'aos Shavos Balalacha</a>. On pages 316-318 he discusses Rav Yisrael
3084         *         Harfenes's calculations and points to his seeming agreement that using fixed local <em>chatzos</em> as the focal
3085         *         point is problematic. See Yisrael Vehazmanim <a href=
3086         *         "https://hebrewbooks.org/pdfpager.aspx?req=9765&st=&pgnum=85">page 57</a>. While the Yisrael Vehazmanim mentions
3087         *         this issue in vol. 1, it was not corrected in the calculations in vol. 3 and other parts of the <em>sefer</em>.
3088         *         A competent rabbinical authority should be consulted before using this <em>zman</em>. Instead, the use of {@link
3089         *         #getSofZmanShma3HoursBeforeChatzos()} should be used to calculate <em>sof zman Tfila</em> using using 3 fixed
3090         *         clock hours. This will likely be removed in v3.0.
3091         */
3092        @Deprecated // (since="2.4.0", forRemoval=true) // add back once Java 9 is the minimum supported version
3093        public Date getSofZmanShmaFixedLocal() {
3094                return getTimeOffset(getFixedLocalChatzos(), -180 * MINUTE_MILLIS);
3095        }
3096
3097        /**
3098         * This method returns the latest <em>zman tfila</em> (time to recite the morning prayers) calculated as 2 hours
3099         * before {@link #getFixedLocalChatzos()}. See the documentation on {@link #getSofZmanShmaFixedLocal()} showing
3100         * differeing opinions on how the <em>zman</em> is calculated. According to many opinions {@link
3101         * #getSofZmanTfila2HoursBeforeChatzos()} should be used as opposed to this <em>zman</em>.
3102         * 
3103         * @return the <code>Date</code> of the latest <em>zman tfila</em>.
3104         * @see #getFixedLocalChatzos()
3105         * @see #getSofZmanShmaFixedLocal()
3106         * @see #getSofZmanTfila2HoursBeforeChatzos()
3107         *         
3108         * @deprecated This method of calculating <em>sof zman Tfila</em> is considered a mistaken understanding of the proper
3109         *         calculation of this <em>zman</em> in the opinion of Rav Yitzchal Silber's <a href=
3110         *         "https://www.worldcat.org/oclc/811253716">Sha'aos Shavos Balalacha</a>. On pages 316-318 he discusses Rav Yisrael
3111         *         Harfenes's calculations and points to his seeming agreement that using fixed local <em>chatzos</em> as the focal
3112         *         point is problematic. See Yisrael Vehazmanim <a href=
3113         *         "https://hebrewbooks.org/pdfpager.aspx?req=9765&st=&pgnum=85">page 57</a>. While the Yisrael Vehazmanim mentions
3114         *         this issue in vol. 1, it was not corrected in the calculations in vol. 3 and other parts of the <em>sefer</em>.
3115         *         A competent rabbinical authority should be consulted before using this <em>zman</em>. Instead, the use of {@link
3116         *         #getSofZmanTfila2HoursBeforeChatzos()} should be used to calculate <em>sof zman Tfila</em> using using 2 fixed
3117         *         clock hours. This will likely be removed in v3.0.
3118         */
3119        @Deprecated // (since="2.4.0", forRemoval=true) // add back once Java 9 is the minimum supported version
3120        public Date getSofZmanTfilaFixedLocal() {
3121                return getTimeOffset(getFixedLocalChatzos(), -120 * MINUTE_MILLIS);
3122        }
3123
3124        /**
3125         * Returns the latest time of <em>Kidush Levana</em> according to the <a
3126         * href="https://en.wikipedia.org/wiki/Yaakov_ben_Moshe_Levi_Moelin">Maharil's</a> opinion that it is calculated as
3127         * halfway between <em>molad</em> and <em>molad</em>. This adds half the 29 days, 12 hours and 793 chalakim time
3128         * between <em>molad</em> and <em>molad</em> (14 days, 18 hours, 22 minutes and 666 milliseconds) to the month's <em>molad</em>.
3129         * If the time of <em>sof zman Kiddush Levana</em> occurs during the day (between the <em>alos</em> and <em>tzais</em> passed in
3130         * as parameters), it returns the <em>alos</em> passed in. If a null <em>alos</em> or <em>tzais</em> are passed to this method,
3131         * the non-daytime adjusted time will be returned.
3132         * 
3133         * @param alos
3134         *            the beginning of the Jewish day. If <em>Kidush Levana</em> occurs during the day (starting at <em>alos</em> and
3135         *            ending at <em>tzais</em>), the time returned will be <em>alos</em>. If either the <em>alos</em> or <em>tzais</em>
3136         *            parameters are null, no daytime adjustment will be made.
3137         * @param tzais
3138         *            the end of the Jewish day. If Kidush Levana occurs during the day (starting at <em>alos</em> and ending at
3139         *            <em>tzais</em>), the time returned will be <em>alos</em>. If either the <em>alos</em> or <em>tzais</em> parameter
3140         *            are null, no daytime adjustment will be made.
3141         * @return the Date representing the moment halfway between molad and molad. If the time occurs between
3142         *         <em>alos</em> and <em>tzais</em>, <em>alos</em> will be returned
3143         * @see #getSofZmanKidushLevanaBetweenMoldos()
3144         * @see #getSofZmanKidushLevana15Days(Date, Date)
3145         * @see JewishCalendar#getSofZmanKidushLevanaBetweenMoldos()
3146         */
3147        public Date getSofZmanKidushLevanaBetweenMoldos(Date alos, Date tzais) {
3148                JewishCalendar jewishCalendar = new JewishCalendar();
3149                jewishCalendar.setGregorianDate(getCalendar().get(Calendar.YEAR), getCalendar().get(Calendar.MONTH),
3150                                getCalendar().get(Calendar.DAY_OF_MONTH));
3151
3152                // Do not calculate for impossible dates, but account for extreme cases. In the extreme case of Rapa Iti in French
3153                // Polynesia on Dec 2027 when kiddush Levana 3 days can be said on <em>Rosh Chodesh</em>, the sof zman Kiddush Levana
3154                // will be on the 12th of the Teves. In the case of Anadyr, Russia on Jan, 2071, sof zman Kiddush Levana between the
3155                // 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) { 
3157                        return null;
3158                }
3159                return getMoladBasedTime(jewishCalendar.getSofZmanKidushLevanaBetweenMoldos(), alos, tzais, false);
3160        }
3161        
3162        /**
3163         * Returns the Date of the <em>molad</em> based time if it occurs on the current date. Since <em>Kiddush Levana</em>
3164         * can only be said during the day, there are parameters to limit it to between <em>alos</em> and <em>tzais</em>. If
3165         * the time occurs between <em>alos</em> and <em>tzais</em>, <em>tzais</em> will be returned.
3166         * 
3167         * @param moladBasedTime
3168         *            the <em>molad</em> based time such as <em>molad</em>, <em>tchilas</em> and <em>sof zman Kiddush Levana</em>
3169         * @param alos
3170         *            optional start of day to limit <em>molad</em> times to the end of the night before or beginning of the next night.
3171         *            Ignored if either <em>alos</em> or <em>tzais</em> are null.
3172         * @param tzais
3173         *            optional end of day to limit <em>molad</em> times to the end of the night before or beginning of the next night.
3174         *            Ignored if either <em>tzais</em> or <em>alos</em> are null
3175         * @param techila
3176         *            is it the start of <em>Kiddush Levana</em> time or the end? If it is start roll it to the next <em>tzais</em>, and
3177         *            and if it is the end, return the end of the previous night (<em>alos</em> passed in). Ignored if either
3178         *            <em>alos</em> or <em>tzais</em> are null.
3179         * @return the <em>molad</em> based time. If the <em>zman</em> does not occur during the current date, null will be returned. 
3180         */
3181        private Date getMoladBasedTime(Date moladBasedTime, Date alos, Date tzais, boolean techila) {
3182                Date lastMidnight = getMidnightLastNight();
3183                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))){
3187                                        return tzais;
3188                                } else {
3189                                        return alos;
3190                                }
3191                        }
3192                        return moladBasedTime;
3193                }
3194                return null;
3195        }
3196
3197        /**
3198         * Returns the latest time of Kiddush Levana according to the <a
3199         * href="https://en.wikipedia.org/wiki/Yaakov_ben_Moshe_Levi_Moelin">Maharil's</a> opinion that it is calculated as
3200         * halfway between <em>molad</em> and <em>molad</em>. This adds half the 29 days, 12 hours and 793 chalakim time between
3201         * <em>molad</em> and <em>molad</em> (14 days, 18 hours, 22 minutes and 666 milliseconds) to the month's <em>molad</em>.
3202         * The <em>sof zman Kiddush Levana</em> will be returned even if it occurs during the day. To limit the time to between
3203         * <em>tzais</em> and <em>alos</em>, see {@link #getSofZmanKidushLevanaBetweenMoldos(Date, Date)}.
3204         * 
3205         * @return the Date representing the moment halfway between molad and molad. If the time occurs between
3206         *         <em>alos</em> and <em>tzais</em>, <em>alos</em> will be returned
3207         * @see #getSofZmanKidushLevanaBetweenMoldos(Date, Date)
3208         * @see #getSofZmanKidushLevana15Days()
3209         * @see JewishCalendar#getSofZmanKidushLevanaBetweenMoldos()
3210         */
3211        public Date getSofZmanKidushLevanaBetweenMoldos() {
3212                return getSofZmanKidushLevanaBetweenMoldos(null, null); 
3213        }
3214
3215        /**
3216         * Returns the latest time of <em>Kiddush Levana</em> calculated as 15 days after the <em>molad</em>. This is the
3217         * opinion brought down in the Shulchan Aruch (Orach Chaim 426). It should be noted that some opinions hold that the
3218         * <a href="https://en.wikipedia.org/wiki/Moses_Isserles">Rema</a> who brings down the opinion of the <a
3219         * href="https://en.wikipedia.org/wiki/Yaakov_ben_Moshe_Levi_Moelin">Maharil's</a> of calculating
3220         * {@link #getSofZmanKidushLevanaBetweenMoldos(Date, Date) half way between <em>molad</em> and <em>molad</em>} is of
3221         * the opinion that the Mechaber agrees to his opinion. Also see the Aruch Hashulchan. For additional details on the subject,
3222         * see Rabbi Dovid Heber's very detailed write-up in <em>Siman Daled</em> (chapter 4) of <a href=
3223         * "https://hebrewbooks.org/53000">Shaarei Zmanim</a>. If the time of <em>sof zman Kiddush Levana</em> occurs during
3224         * the day (between the <em>alos</em> and <em>tzais</em> passed in as parameters), it returns the <em>alos</em> passed in. If a
3225         * null <em>alos</em> or <em>tzais</em> are passed to this method, the non-daytime adjusted time will be returned.
3226         * 
3227         * @param alos
3228         *            the beginning of the Jewish day. If <em>Kidush Levana</em> occurs during the day (starting at <em>alos</em> and
3229         *            ending at <em>tzais</em>), the time returned will be <em>alos</em>. If either the <em>alos</em> or <em>tzais</em>
3230         *            parameters are null, no daytime adjustment will be made.
3231         * @param tzais
3232         *            the end of the Jewish day. If <em>Kidush Levana</em> occurs during the day (starting at <em>alos</em> and ending at
3233         *            <em>tzais</em>), the time returned will be <em>alos</em>. If either the <em>alos</em> or <em>tzais</em> parameters
3234         *            are null, no daytime adjustment will be made.
3235         *
3236         * @return the Date representing the moment 15 days after the molad. If the time occurs between <em>alos</em> and
3237         *         <em>tzais</em>, <em>alos</em> will be returned
3238         * 
3239         * @see #getSofZmanKidushLevanaBetweenMoldos(Date, Date)
3240         * @see JewishCalendar#getSofZmanKidushLevana15Days()
3241         */
3242        public Date getSofZmanKidushLevana15Days(Date alos, Date tzais) {
3243                JewishCalendar jewishCalendar = new JewishCalendar();
3244                jewishCalendar.setGregorianDate(getCalendar().get(Calendar.YEAR), getCalendar().get(Calendar.MONTH),
3245                                getCalendar().get(Calendar.DAY_OF_MONTH));
3246                // Do not calculate for impossible dates, but account for extreme cases. In the extreme case of Rapa Iti in
3247                // French Polynesia on Dec 2027 when kiddush Levana 3 days can be said on <em>Rosh Chodesh</em>, the sof zman Kiddush
3248                // Levana will be on the 12th of the Teves. in the case of Anadyr, Russia on Jan, 2071, sof zman kiddush levana will
3249                // 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) {
3251                        return null;
3252                }
3253                return getMoladBasedTime(jewishCalendar.getSofZmanKidushLevana15Days(), alos, tzais, false);
3254        }
3255
3256        /**
3257         * Returns the latest time of <em>Kiddush Levana</em> calculated as 15 days after the molad. This is the opinion of
3258         * the Shulchan Aruch (Orach Chaim 426). It should be noted that some opinions hold that the
3259         * <a href="https://en.wikipedia.org/wiki/Moses_Isserles">Rema</a> who brings down the opinion of the <a
3260         * href="https://en.wikipedia.org/wiki/Yaakov_ben_Moshe_Levi_Moelin">Maharil's</a> of calculating
3261         * {@link #getSofZmanKidushLevanaBetweenMoldos(Date, Date) half way between <em>molad</em> and <em>molad</em>} is of
3262         * the opinion that the Mechaber agrees to his opinion. Also see the Aruch Hashulchan. For additional details on the subject,
3263         * See Rabbi Dovid Heber's very detailed write-up in Siman Daled (chapter 4) of <a href="https://hebrewbooks.org/53000">Shaarei
3264         * Zmanim</a>. The <em>sof zman Kiddush Levana</em> will be returned even if it occurs during the day. To limit the time to
3265         * between <em>tzais</em> and <em>alos</em>, see {@link #getSofZmanKidushLevana15Days(Date, Date)}.
3266         * 
3267         * @return the Date representing the moment 15 days after the <em>molad</em>. If the time occurs between
3268         *         <em>alos</em> and <em>tzais</em>, <em>alos</em> will be returned
3269         * 
3270         * @see #getSofZmanKidushLevana15Days(Date, Date)
3271         * @see #getSofZmanKidushLevanaBetweenMoldos()
3272         * @see JewishCalendar#getSofZmanKidushLevana15Days()
3273         * 
3274         */
3275        public Date getSofZmanKidushLevana15Days() {
3276                return getSofZmanKidushLevana15Days(null, null);
3277        }
3278        
3279        /**
3280         * Returns the earliest time of <em>Kiddush Levana</em> according to <a href=
3281         * "https://en.wikipedia.org/wiki/Yonah_Gerondi">Rabbeinu Yonah</a>'s opinion that it can be said 3 days after the
3282         * <em>molad</em>. The time will be returned even if it occurs during the day when <em>Kiddush Levana</em> can't be said.
3283         * Use {@link #getTchilasZmanKidushLevana3Days(Date, Date)} if you want to limit the time to night hours.
3284         * 
3285         * @return the Date representing the moment 3 days after the molad.
3286         * @see #getTchilasZmanKidushLevana3Days(Date, Date)
3287         * @see #getTchilasZmanKidushLevana7Days()
3288         * @see JewishCalendar#getTchilasZmanKidushLevana3Days()
3289         */
3290        public Date getTchilasZmanKidushLevana3Days() {
3291                return getTchilasZmanKidushLevana3Days(null, null);
3292        }
3293
3294        /**
3295         * Returns the earliest time of <em>Kiddush Levana</em> according to <a href=
3296         * "https://en.wikipedia.org/wiki/Yonah_Gerondi">Rabbeinu Yonah</a>'s opinion that it can be said 3 days after the <em>molad</em>.
3297         * If the time of <em>tchilas zman Kiddush Levana</em> occurs during the day (between <em>alos</em> and <em>tzais</em> passed to
3298         * this method) it will return the following <em>tzais</em>. If null is passed for either <em>alos</em> or <em>tzais</em>, the actual
3299         * <em>tchilas zman Kiddush Levana</em> will be returned, regardless of if it is during the day or not.
3300         * 
3301         * @param alos
3302         *            the beginning of the Jewish day. If Kidush Levana occurs during the day (starting at <em>alos</em> and ending
3303         *            at <em>tzais</em>), the time returned will be <em>tzais</em>. If either the <em>alos</em> or <em>tzais</em> parameters
3304         *            are null, no daytime adjustment will be made.
3305         * @param tzais
3306         *            the end of the Jewish day. If <em>Kidush Levana</em> occurs during the day (starting at <em>alos</em> and ending at
3307         *            <em>tzais</em>), the time returned will be <em>tzais</em>. If either the <em>alos</em> or <em>tzais</em> parameters
3308         *            are null, no daytime adjustment will be made.
3309         *
3310         * @return the Date representing the moment 3 days after the molad. If the time occurs between <em>alos</em> and
3311         *         <em>tzais</em>, <em>tzais</em> will be returned
3312         * @see #getTchilasZmanKidushLevana3Days()
3313         * @see #getTchilasZmanKidushLevana7Days(Date, Date)
3314         * @see JewishCalendar#getTchilasZmanKidushLevana3Days()
3315         */
3316        public Date getTchilasZmanKidushLevana3Days(Date alos, Date tzais) {
3317                JewishCalendar jewishCalendar = new JewishCalendar();
3318                jewishCalendar.setGregorianDate(getCalendar().get(Calendar.YEAR), getCalendar().get(Calendar.MONTH),
3319                                getCalendar().get(Calendar.DAY_OF_MONTH));
3320                
3321                // Do not calculate for impossible dates, but account for extreme cases. Tchilas zman kiddush Levana 3 days for
3322                // the extreme case of Rapa Iti in French Polynesia on Dec 2027 when kiddush Levana 3 days can be said on the evening
3323                // 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.
3324                // In the case of Anadyr, Russia on Jan, 2071, when sof zman kiddush levana is on the 17th of the month, the 3rd day
3325                // 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) {
3327                        return null;
3328                }
3329                
3330                Date zman = getMoladBasedTime(jewishCalendar.getTchilasZmanKidushLevana3Days(), alos, tzais, true);
3331                
3332                //Get the following month's zman kiddush Levana for the extreme case of Rapa Iti in French Polynesia on Dec 2027 when
3333                // 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) {
3335                        jewishCalendar.forward(Calendar.MONTH, 1);
3336                        zman = getMoladBasedTime(jewishCalendar.getTchilasZmanKidushLevana3Days(), null, null, true);
3337                }
3338                
3339                return zman;
3340        }
3341        
3342        /**
3343         * Returns the point in time of <em>Molad</em> as a <code>Date</code> Object. For the traditional day of week, hour,
3344         * minute and chalakim, {@link JewishCalendar#getMoladAsDate()} and the not yet completed
3345         * {@link com.kosherjava.zmanim.hebrewcalendar.HebrewDateFormatter} that will have formatting for this.
3346         * 
3347         * @return the Date representing the moment of the molad. If the molad does not occur on this day, a null will be returned.
3348         * 
3349         * @see #getTchilasZmanKidushLevana3Days()
3350         * @see #getTchilasZmanKidushLevana7Days(Date, Date)
3351         * @see JewishCalendar#getMoladAsDate()
3352         */
3353        public Date getZmanMolad() {
3354                JewishCalendar jewishCalendar = new JewishCalendar();
3355                jewishCalendar.setGregorianDate(getCalendar().get(Calendar.YEAR), getCalendar().get(Calendar.MONTH),
3356                                getCalendar().get(Calendar.DAY_OF_MONTH));
3357                
3358                // Optimize to not calculate for impossible dates, but account for extreme cases. The molad in the extreme case of Rapa
3359                // Iti in French Polynesia on Dec 2027 occurs on the night of the 27th of Kislev. In the case of Anadyr, Russia on
3360                // 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) {
3362                        return null;
3363                }
3364                Date molad = getMoladBasedTime(jewishCalendar.getMoladAsDate(), null, null, true);
3365
3366                // deal with molad that happens on the end of the previous month
3367                if(molad == null && jewishCalendar.getJewishDayOfMonth() > 26) {
3368                        jewishCalendar.forward(Calendar.MONTH, 1);
3369                        molad = getMoladBasedTime(jewishCalendar.getMoladAsDate(), null, null, true);
3370                }
3371                return molad;
3372        }
3373        
3374        /**
3375         * Used by Molad based <em>zmanim</em> to determine if <em>zmanim</em> occur during the current day.
3376         * @see #getMoladBasedTime(Date, Date, Date, boolean)
3377         * @return previous midnight
3378         */
3379        private Date getMidnightLastNight() {
3380                Calendar midnight = (Calendar)getCalendar().clone();
3381                // reset hour, minutes, seconds and millis
3382                midnight.set(Calendar.HOUR_OF_DAY, 0);
3383                midnight.set(Calendar.MINUTE, 0);
3384                midnight.set(Calendar.SECOND, 0);
3385                midnight.set(Calendar.MILLISECOND, 0);
3386                return midnight.getTime();
3387        }
3388        
3389        /**
3390         * Used by Molad based <em>zmanim</em> to determine if <em>zmanim</em> occur during the current day.
3391         * @see #getMoladBasedTime(Date, Date, Date, boolean)
3392         * @return following midnight
3393         */
3394        private Date getMidnightTonight() {
3395                Calendar midnight = (Calendar)getCalendar().clone();
3396                midnight.add(Calendar.DAY_OF_YEAR, 1);//roll to tonight
3397                midnight.set(Calendar.HOUR_OF_DAY, 0);
3398                midnight.set(Calendar.MINUTE, 0);
3399                midnight.set(Calendar.SECOND, 0);
3400                midnight.set(Calendar.MILLISECOND, 0);
3401                return midnight.getTime();
3402        }
3403
3404        /**
3405         * Returns the earliest time of <em>Kiddush Levana</em> according to the opinions that it should not be said until 7
3406         * days after the <em>molad</em>. If the time of <em>tchilas zman Kiddush Levana</em> occurs during the day (between
3407         * {@link ZmanimCalendar#getAlos72() <em>alos</em>} and {@link ZmanimCalendar#getTzais72() <em>tzais</em>}) it
3408         * return the next <em>tzais</em>.
3409         * 
3410         * @param alos
3411         *            the beginning of the Jewish day. If <em>Kidush Levana</em> occurs during the day (starting at <em>alos</em>
3412         *            and ending at <em>tzais</em>), the time returned will be <em>tzais</em>. If either the <em>alos</em> or
3413         *            <em>tzais</em> parameters are null, no daytime adjustment will be made.
3414         * @param tzais
3415         *            the end of the Jewish day. If <em>Kidush Levana</em> occurs during the day (starting at <em>alos</em> and
3416         *            ending at <em>tzais</em>), the time returned will be <em>tzais</em>. If either the <em>alos</em> or
3417         *            <em>tzais</em> parameters are null, no daytime adjustment will be made.
3418         *
3419         * @return the Date representing the moment 7 days after the molad. If the time occurs between <em>alos</em> and
3420         *         <em>tzais</em>, <em>tzais</em> will be returned
3421         * @see #getTchilasZmanKidushLevana3Days(Date, Date)
3422         * @see #getTchilasZmanKidushLevana7Days()
3423         * @see JewishCalendar#getTchilasZmanKidushLevana7Days()
3424         */
3425        public Date getTchilasZmanKidushLevana7Days(Date alos, Date tzais) {
3426                JewishCalendar jewishCalendar = new JewishCalendar();
3427                jewishCalendar.setGregorianDate(getCalendar().get(Calendar.YEAR), getCalendar().get(Calendar.MONTH),
3428                                getCalendar().get(Calendar.DAY_OF_MONTH));
3429                
3430                // Optimize to not calculate for impossible dates, but account for extreme cases. Tchilas zman kiddush Levana 7 days for
3431                // the extreme case of Rapa Iti in French Polynesia on Jan 2028 (when kiddush Levana 3 days can be said on the evening
3432                // of the 30th, the second night of Rosh Chodesh), the 7th day after the molad will be on the 4th of the month.
3433                // In the case of Anadyr, Russia on Jan, 2071, when sof zman kiddush levana is on the 17th of the month, the 7th day
3434                // 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) { 
3436                        return null;
3437                }
3438                
3439                return getMoladBasedTime(jewishCalendar.getTchilasZmanKidushLevana7Days(), alos, tzais, true);
3440        }
3441
3442        /**
3443         * Returns the earliest time of <em>Kiddush Levana</em> according to the opinions that it should not be said until 7
3444         * days after the <em>molad</em>. The time will be returned even if it occurs during the day when <em>Kiddush Levana</em>
3445         * can't be recited. Use {@link #getTchilasZmanKidushLevana7Days(Date, Date)} if you want to limit the time to night hours.
3446         * 
3447         * @return the Date representing the moment 7 days after the molad regardless of it is day or night.
3448         * @see #getTchilasZmanKidushLevana7Days(Date, Date)
3449         * @see JewishCalendar#getTchilasZmanKidushLevana7Days()
3450         * @see #getTchilasZmanKidushLevana3Days()
3451         */
3452        public Date getTchilasZmanKidushLevana7Days() {
3453                return getTchilasZmanKidushLevana7Days(null, null);
3454        }
3455
3456        /**
3457         * This method returns the latest time one is allowed eating <em>chametz</em> on <em>Erev Pesach</em> according to
3458         * the opinion of the<a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a>. This time is identical to the {@link
3459         * #getSofZmanTfilaGRA() <em>Sof zman tfilah</em> GRA} and is provided as a convenience method for those who are
3460         * unaware how this <em>zman</em> is calculated. This time is 4 hours into the day based on the opinion of the
3461         * <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> that the day is calculated from sunrise to sunset.
3462         * This returns the time 4 * {@link #getShaahZmanisGra()} after {@link #getSeaLevelSunrise() sea level sunrise}.
3463         * 
3464         * @see ZmanimCalendar#getShaahZmanisGra()
3465         * @see ZmanimCalendar#getSofZmanTfilaGRA()
3466         * @return the <code>Date</code> one is allowed eating <em>chametz</em> on <em>Erev Pesach</em>. If the calculation
3467         *         can't be computed such as in the Arctic Circle where there is at least one day a year where the sun does
3468         *         not rise, and one where it does not set, a null will be returned. See detailed explanation on top of the
3469         *         {@link AstronomicalCalendar} documentation.
3470         */
3471        public Date getSofZmanAchilasChametzGRA() {
3472                return getSofZmanTfilaGRA();
3473        }
3474
3475        /**
3476         * This method returns the latest time one is allowed eating <em>chametz</em> on <em>Erev Pesach</em> according to the
3477         * opinionof the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
3478         * being {@link #getAlos72() 72} minutes before {@link #getSunrise() sunrise}. This time is identical to the
3479         * {@link #getSofZmanTfilaMGA72Minutes() <em>Sof zman tfilah</em> MGA 72 minutes}. This time is 4 {@link #getShaahZmanisMGA()
3480         * <em>shaos zmaniyos</em>} (temporal hours) after {@link #getAlos72() dawn} based on the opinion of the MGA that the day is
3481         * calculated from a {@link #getAlos72() dawn} of 72 minutes before sunrise to {@link #getTzais72() nightfall} of 72 minutes
3482         * after sunset. This returns the time of 4 * {@link #getShaahZmanisMGA()} after {@link #getAlos72() dawn}.
3483         * 
3484         * @return the <code>Date</code> of the latest time of eating <em>chametz</em>. If the calculation can't be computed such as
3485         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
3486         *         does not set), a null will be returned. See detailed explanation on top of the
3487         *         {@link AstronomicalCalendar} documentation.
3488         * @see #getShaahZmanisMGA()
3489         * @see #getAlos72()
3490         * @see #getSofZmanTfilaMGA72Minutes()
3491         */
3492        public Date getSofZmanAchilasChametzMGA72Minutes() {
3493                return getSofZmanTfilaMGA72Minutes();
3494        }
3495
3496        /**
3497         * This method returns the latest time one is allowed eating <em>chametz</em> on <em>Erev Pesach</em> according to the
3498         * opinion of the<a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
3499         * being {@link #getAlos16Point1Degrees() 16.1&deg;} before {@link #getSunrise() sunrise}. This time is 4 {@link
3500         * #getShaahZmanis16Point1Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos16Point1Degrees() dawn}
3501         * based on the opinion of the MGA that the day is calculated from dawn to nightfall with both being 16.1&deg;
3502         * below sunrise or sunset. This returns the time of 4 {@link #getShaahZmanis16Point1Degrees()} after
3503         * {@link #getAlos16Point1Degrees() dawn}.
3504         * 
3505         * @return the <code>Date</code> of the latest time of eating <em>chametz</em>. If the calculation can't be computed such
3506         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle where
3507         *         the sun may not reach low enough below the horizon for this calculation, a null will be returned. See
3508         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3509         * 
3510         * @see #getShaahZmanis16Point1Degrees()
3511         * @see #getAlos16Point1Degrees()
3512         * @see #getSofZmanTfilaMGA16Point1Degrees()
3513         */
3514        public Date getSofZmanAchilasChametzMGA16Point1Degrees() {
3515                return getSofZmanTfilaMGA16Point1Degrees();
3516        }
3517
3518        /**
3519         * This method returns the latest time for burning <em>chametz</em> on <em>Erev Pesach</em> according to the opinion
3520         * of the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a>. This time is 5 hours into the day based on the
3521         * opinion of the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> that the day is calculated from
3522         * sunrise to sunset. This returns the time 5 * {@link #getShaahZmanisGra()} after {@link #getSeaLevelSunrise() sea
3523         * level sunrise}.
3524         * 
3525         * @see ZmanimCalendar#getShaahZmanisGra()
3526         * @return the <code>Date</code> of the latest time for burning <em>chametz</em> on <em>Erev Pesach</em>. If the
3527         *         calculation can't be computed such as in the Arctic Circle where there is at least one day a year where
3528         *         the sun does not rise,and one where it does not set, a null will be returned. See detailed explanation on
3529         *         top of the {@link AstronomicalCalendar} documentation.
3530         */
3531        public Date getSofZmanBiurChametzGRA() {
3532                return getTimeOffset(getElevationAdjustedSunrise(), getShaahZmanisGra() * 5);
3533        }
3534
3535        /**
3536         * This method returns the latest time for burning <em>chametz</em> on <em>Erev Pesach</em> according to the opinion of
3537         * the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
3538         * being {@link #getAlos72() 72} minutes before {@link #getSunrise() sunrise}. This time is 5 {@link
3539         * #getShaahZmanisMGA() <em>shaos zmaniyos</em>} (temporal hours) after {@link #getAlos72() dawn} based on the opinion of
3540         * the MGA that the day is calculated from a {@link #getAlos72() dawn} of 72 minutes before sunrise to {@link
3541         * #getTzais72() nightfall} of 72 minutes after sunset. This returns the time of 5 * {@link #getShaahZmanisMGA()} after
3542         * {@link #getAlos72() dawn}.
3543         * 
3544         * @return the <code>Date</code> of the latest time for burning <em>chametz</em> on <em>Erev Pesach</em>. If the calculation
3545         *         can't be computed such as in the Arctic Circle where there is at least one day a year where the sun does not rise,
3546         *         and one where it does not set), a null will be returned. See detailed explanation on top of the
3547         *         {@link AstronomicalCalendar} documentation.
3548         * @see #getShaahZmanisMGA()
3549         * @see #getAlos72()
3550         */
3551        public Date getSofZmanBiurChametzMGA72Minutes() {
3552                return getTimeOffset(getAlos72(), getShaahZmanisMGA() * 5);
3553        }
3554
3555        /**
3556         * This method returns the latest time for burning <em>chametz</em> on <em>Erev Pesach</em> according to the opinion
3557         * of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> based on <em>alos</em>
3558         * being {@link #getAlos16Point1Degrees() 16.1&deg;} before {@link #getSunrise() sunrise}. This time is 5
3559         * {@link #getShaahZmanis16Point1Degrees() <em>shaos zmaniyos</em>} (solar hours) after {@link #getAlos16Point1Degrees()
3560         * dawn} based on the opinion of the MGA that the day is calculated from dawn to nightfall with both being 16.1&deg;
3561         * below sunrise or sunset. This returns the time of 5 {@link #getShaahZmanis16Point1Degrees()} after
3562         * {@link #getAlos16Point1Degrees() dawn}.
3563         * 
3564         * @return the <code>Date</code> of the latest time for burning <em>chametz</em> on <em>Erev Pesach</em>. If the calculation
3565         *         can't be computed such as northern and southern locations even south of the Arctic Circle and north of the
3566         *         Antarctic Circle where the sun may not reach low enough below the horizon for this calculation, a null
3567         *         will be returned. See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3568         * 
3569         * @see #getShaahZmanis16Point1Degrees()
3570         * @see #getAlos16Point1Degrees()
3571         */
3572        public Date getSofZmanBiurChametzMGA16Point1Degrees() {
3573                return getTimeOffset(getAlos16Point1Degrees(), getShaahZmanis16Point1Degrees() * 5);
3574        }
3575
3576        /**
3577         * A method that returns "solar" midnight, or the time when the sun is at its <a
3578         * href="https://en.wikipedia.org/wiki/Nadir">nadir</a>.
3579         * <b>Note:</b> this method is experimental and might be removed.
3580         * 
3581         * @return the <code>Date</code> of Solar Midnight (chatzos layla). If the calculation can't be computed such as in
3582         *         the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
3583         *         does not set, a null will be returned. See detailed explanation on top of the
3584         *         {@link AstronomicalCalendar} documentation.
3585         */
3586        public Date getSolarMidnight() {
3587                ZmanimCalendar clonedCal = (ZmanimCalendar) clone();
3588                clonedCal.getCalendar().add(Calendar.DAY_OF_MONTH, 1);
3589                Date sunset = getSeaLevelSunset();
3590                Date sunrise = clonedCal.getSeaLevelSunrise();
3591                return getTimeOffset(sunset, getTemporalHour(sunset, sunrise) * 6);
3592        }
3593        
3594        /**
3595         * A method that returns the <a href="https://en.wikipedia.org/wiki/Shneur_Zalman_of_Liadi">Baal Hatanya</a>'s
3596         * <em>netz amiti</em> (sunrise) without {@link AstronomicalCalculator#getElevationAdjustment(double)
3597         * elevation adjustment}. This forms the base for the Baal Hatanya's dawn based calculations that are
3598         * calculated as a dip below the horizon before sunrise.
3599         *
3600         * According to the Baal Hatanya, <em>netz amiti</em>, or true (halachic) sunrise, is when the top of the sun's
3601         * disk is visible at an elevation similar to the mountains of Eretz Yisrael. The time is calculated as the point at which
3602         * the center of the sun's disk is 1.583&deg; below the horizon. This degree based calculation can be found in Rabbi Shalom
3603         * DovBer Levine's commentary on The <a href="https://www.chabadlibrary.org/books/pdf/Seder-Hachnosas-Shabbos.pdf">Baal
3604         * Hatanya's Seder Hachnasas Shabbos</a>. From an elevation of 546 meters, the top of <a href=
3605         * "https://en.wikipedia.org/wiki/Mount_Carmel">Har Hacarmel</a>, the sun disappears when it is 1&deg; 35' or 1.583&deg;
3606         * below the sea level horizon. This in turn is based on the Gemara <a href=
3607         * "https://hebrewbooks.org/shas.aspx?mesechta=2&daf=35">Shabbos 35a</a>. There are other opinions brought down by
3608         * Rabbi Levine, including Rabbi Yosef Yitzchok Feigelstock who calculates it as the degrees below the horizon 4 minutes after
3609         * sunset in Yerushalaym (on the equinox). That is brought down as 1.583&deg;. This is identical to the 1&deg; 35' <em>zman</em>
3610         * and is probably a typo and should be 1.683&deg;. These calculations are used by most <a href=
3611         * "https://en.wikipedia.org/wiki/Chabad">Chabad</a> calendars that use the Baal Hatanya's <em>zmanim</em>. See
3612         * <a href="https://www.chabad.org/library/article_cdo/aid/3209349/jewish/About-Our-Zmanim-Calculations.htm">About Our
3613         * <em>Zmanim</em> Calculations @ Chabad.org</a>.
3614         *
3615         * Note: <em>netz amiti</em> is used only for calculating certain <em>zmanim</em>, and is intentionally unpublished. For
3616         * practical purposes, daytime <em>mitzvos</em> like <em>shofar</em> and <em>lulav</em> should not be done until after the
3617         * published time for <em>netz</em> / sunrise.
3618         * 
3619         * @return the <code>Date</code> representing the exact sea-level <em>netz amiti</em> (sunrise) time. If the calculation can't be
3620         *         computed such as in the Arctic Circle where there is at least one day a year where the sun does not rise, and one
3621         *         where it does not set, a null will be returned. See detailed explanation on top of the page.
3622         * 
3623         * @see #getSunrise()
3624         * @see #getSeaLevelSunrise()
3625         * @see #getSunsetBaalHatanya()
3626         * @see #ZENITH_1_POINT_583
3627         */
3628        private Date getSunriseBaalHatanya() {
3629                return getSunriseOffsetByDegrees(ZENITH_1_POINT_583);
3630        }
3631
3632        /**
3633         * A method that returns the <a href="https://en.wikipedia.org/wiki/Shneur_Zalman_of_Liadi">Baal Hatanya</a>'s
3634         * <em>shkiah amiti</em> (sunset) without {@link AstronomicalCalculator#getElevationAdjustment(double)
3635         * elevation adjustment}. This forms the base for the Baal Hatanya's dusk based calculations that are calculated
3636         * as a dip below the horizon after sunset.
3637         * 
3638         * According to the Baal Hatanya, <em>shkiah amiti</em>, true (<em>halachic</em>) sunset, is when the top of the 
3639         * sun's disk disappears from view at an elevation similar to the mountains of <em>Eretz Yisrael</em>.
3640         * This time is calculated as the point at which the center of the sun's disk is 1.583 degrees below the horizon.
3641         *
3642         * Note: <em>shkiah amiti</em> is used only for calculating certain <em>zmanim</em>, and is intentionally unpublished. For
3643         * practical purposes, all daytime mitzvos should be completed before the published time for <em>shkiah</em> / sunset.
3644         *
3645         * For further explanation of the calculations used for the Baal Hatanya's <em>zmanim</em> in this library, see
3646         * <a href="https://www.chabad.org/library/article_cdo/aid/3209349/jewish/About-Our-Zmanim-Calculations.htm">About Our
3647         * <em>Zmanim</em> Calculations @ Chabad.org</a>.
3648         * 
3649         * @return the <code>Date</code> representing the exact sea-level <em>shkiah amiti</em> (sunset) time. If the calculation
3650         *         can't be computed such as in the Arctic Circle where there is at least one day a year where the sun does not
3651         *         rise, and one where it does not set, a null will be returned. See detailed explanation on top of the
3652         *         {@link AstronomicalCalendar} documentation.
3653         * 
3654         * @see #getSunset()
3655         * @see #getSeaLevelSunset()
3656         * @see #getSunriseBaalHatanya()
3657         * @see #ZENITH_1_POINT_583
3658         */
3659        private Date getSunsetBaalHatanya() {
3660                return getSunsetOffsetByDegrees(ZENITH_1_POINT_583);
3661        }
3662
3663        /**
3664         * A method that returns the <a href="https://en.wikipedia.org/wiki/Shneur_Zalman_of_Liadi">Baal Hatanya</a>'s
3665         * a <em>shaah zmanis</em> ({@link #getTemporalHour(Date, Date) temporal hour}). This forms the base for the
3666         * Baal Hatanya's  day  based calculations that are calculated as a 1.583&deg; dip below the horizon after sunset. 
3667         * According to the Baal Hatanya, <em>shkiah amiti</em>, true (halachic) sunset, is when the top of the 
3668         * sun's disk disappears from view at an elevation similar to the mountains of Eretz Yisrael.
3669         * This time is calculated as the point at which the center of the sun's disk is 1.583 degrees below the horizon.
3670         * A method that returns a <em>shaah zmanis</em> ({@link #getTemporalHour(Date, Date) temporal hour}) calculated 
3671         * based on the <a href="https://en.wikipedia.org/wiki/Shneur_Zalman_of_Liadi">Baal Hatanya</a>'s <em>netz
3672         * amiti</em> and <em>shkiah amiti</em> using a dip of 1.583&deg; below the sea level horizon. This calculation divides
3673         * the day based on the opinion of the Baal Hatanya that the day runs from {@link #getSunriseBaalHatanya() netz amiti}
3674         * to {@link #getSunsetBaalHatanya() <em>shkiah amiti</em>}. The calculations are based on a day from {@link
3675         * #getSunriseBaalHatanya() sea level <em>netz amiti</em>} to {@link #getSunsetBaalHatanya() sea level <em>shkiah amiti</em>}.
3676         * The day is split into 12 equal parts with each one being a <em>shaah zmanis</em>. This method is similar to {@link
3677         * #getTemporalHour}, but all calculations are based on a sea level sunrise and sunset.
3678         * @return the <code>long</code> millisecond length of a <em>shaah zmanis</em> calculated from
3679         *         {@link #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)} to {@link #getSunsetBaalHatanya() <em>shkiah amiti</em>
3680         *         ("real" sunset)}. If the calculation can't be computed such as in the Arctic Circle where there is at least one day a
3681         *         year where the sun does not rise, and one where it does not set, {@link Long#MIN_VALUE} will be returned. See
3682         *         detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3683         * 
3684         * @see #getTemporalHour(Date, Date)
3685         * @see #getSunriseBaalHatanya()
3686         * @see #getSunsetBaalHatanya()
3687         * @see #ZENITH_1_POINT_583
3688         */
3689        public long getShaahZmanisBaalHatanya() {
3690                return getTemporalHour(getSunriseBaalHatanya(), getSunsetBaalHatanya());
3691        }
3692
3693        /**
3694         * Returns the <a href="https://en.wikipedia.org/wiki/Shneur_Zalman_of_Liadi">Baal Hatanya</a>'s <em>alos</em>
3695         * (dawn) calculated as the time when the sun is 16.9&deg; below the eastern {@link #GEOMETRIC_ZENITH geometric horizon}
3696         * before {@link #getSunrise sunrise}. For more information the source of 16.9&deg; see {@link #ZENITH_16_POINT_9}.
3697         * 
3698         * @see #ZENITH_16_POINT_9
3699         * @return The <code>Date</code> of dawn. If the calculation can't be computed such as northern and southern
3700         *         locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not reach
3701         *         low enough below the horizon for this calculation, a null will be returned. See detailed explanation on
3702         *         top of the {@link AstronomicalCalendar} documentation.
3703         */
3704        public Date getAlosBaalHatanya() {
3705                return getSunriseOffsetByDegrees(ZENITH_16_POINT_9);
3706        }
3707
3708        /**
3709         * This method returns the latest <em>zman krias shema</em> (time to recite Shema in the morning). This time is 3
3710         * {@link #getShaahZmanisBaalHatanya() <em>shaos zmaniyos</em>} (solar hours) after {@link #getSunriseBaalHatanya() 
3711         * <em>netz amiti</em> (sunrise)} based on the opinion of the Baal Hatanya that the day is calculated from
3712         * sunrise to sunset. This returns the time 3 * {@link #getShaahZmanisBaalHatanya()} after {@link #getSunriseBaalHatanya() 
3713         * <em>netz amiti</em> (sunrise)}.
3714         * 
3715         * @see ZmanimCalendar#getSofZmanShma(Date, Date)
3716         * @see #getShaahZmanisBaalHatanya()
3717         * @return the <code>Date</code> of the latest <em>zman shema</em> according to the Baal Hatanya. If the calculation
3718         *         can't be computed such as in the Arctic Circle where there is at least one day a year where the sun does
3719         *         not rise, and one where it does not set, a null will be returned. See detailed explanation on top of the
3720         *         {@link AstronomicalCalendar} documentation.
3721         */
3722        public Date getSofZmanShmaBaalHatanya() {
3723                return getSofZmanShma(getSunriseBaalHatanya(), getSunsetBaalHatanya());
3724        }
3725
3726        /**
3727         * This method returns the latest <em>zman tfilah</em> (time to recite the morning prayers). This time is 4
3728         * hours into the day based on the opinion of the Baal Hatanya that the day is
3729         * calculated from sunrise to sunset. This returns the time 4 * {@link #getShaahZmanisBaalHatanya()} after
3730         * {@link #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)}.
3731         * 
3732         * @see ZmanimCalendar#getSofZmanTfila(Date, Date)
3733         * @see #getShaahZmanisBaalHatanya()
3734         * @return the <code>Date</code> of the latest <em>zman tfilah</em>. If the calculation can't be computed such as in
3735         *         the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it does
3736         *         not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
3737         *         documentation.
3738         */
3739        public Date getSofZmanTfilaBaalHatanya() {
3740                return getSofZmanTfila(getSunriseBaalHatanya(), getSunsetBaalHatanya());
3741        }
3742
3743        /**
3744         * This method returns the latest time one is allowed eating <em>chametz</em> on <em>Erev Pesach</em> according to the
3745         * opinion of the Baal Hatanya. This time is identical to the {@link #getSofZmanTfilaBaalHatanya() <em>Sof zman tfilah</em>
3746         * Baal Hatanya}. This time is 4 hours into the day based on the opinion of the Baal Hatanya that the day is calculated
3747         * from sunrise to sunset. This returns the time 4 {@link #getShaahZmanisBaalHatanya()} after
3748         * {@link #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)}.
3749         * 
3750         * @see #getShaahZmanisBaalHatanya()
3751         * @see #getSofZmanTfilaBaalHatanya()
3752         * @return the <code>Date</code> one is allowed eating <em>chametz</em> on <em>Erev Pesach</em>. If the calculation can't
3753         *         be computed such as in the Arctic Circle where there is at least one day a year where the sun does not rise,
3754         *         and one where it does not set, a null will be returned. See detailed explanation on top of the
3755         *         {@link AstronomicalCalendar} documentation.
3756         */
3757        public Date getSofZmanAchilasChametzBaalHatanya() {
3758                return getSofZmanTfilaBaalHatanya();
3759        }
3760
3761        /**
3762         * This method returns the latest time for burning <em>chametz</em> on <em>Erev Pesach</em> according to the opinion of
3763         * the Baal Hatanya. This time is 5 hours into the day based on the opinion of the Baal Hatanya that the day is calculated
3764         * from sunrise to sunset. This returns the time 5 * {@link #getShaahZmanisBaalHatanya()} after
3765         * {@link #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)}.
3766         * 
3767         * @see #getShaahZmanisBaalHatanya()
3768         * @return the <code>Date</code> of the latest time for burning <em>chametz</em> on <em>Erev Pesach</em>. If the calculation
3769         *         can't becomputed such as in the Arctic Circle where there is at least one day a year where the sun does not rise,
3770         *         and one where it does not set, a null will be returned. See detailed explanation on top of the
3771         *         {@link AstronomicalCalendar} documentation.
3772         */
3773        public Date getSofZmanBiurChametzBaalHatanya() {
3774                return getTimeOffset(getSunriseBaalHatanya(), getShaahZmanisBaalHatanya() * 5);
3775        }
3776
3777        /**
3778         * This method returns the time of <em>mincha gedola</em>. <em>Mincha gedola</em> is the earliest time one can pray
3779         * <em>mincha</em>. The <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> is of the opinion that it is
3780         * better to delay <em>mincha</em> until {@link #getMinchaKetanaBaalHatanya() <em>mincha ketana</em>} while the
3781         * <a href="https://en.wikipedia.org/wiki/Asher_ben_Jehiel">Ra"sh</a>,
3782         * <a href="https://en.wikipedia.org/wiki/Jacob_ben_Asher">Tur</a>, <a href=
3783         * "https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> and others are of the opinion that <em>mincha</em> can be prayed
3784         * <em>lechatchila</em> starting at <em>mincha gedola</em>. This is calculated as 6.5 {@link #getShaahZmanisBaalHatanya()
3785         * sea level solar hours} after {@link #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)}. This calculation is based
3786         * on the opinion of the Baal Hatanya that the day is calculated from sunrise to sunset. This returns the time 6.5
3787         * * {@link #getShaahZmanisBaalHatanya()} after {@link #getSunriseBaalHatanya() <em>netz amiti</em> ("real" sunrise)}.
3788         * 
3789         * @see #getMinchaGedola(Date, Date)
3790         * @see #getShaahZmanisBaalHatanya()
3791         * @see #getMinchaKetanaBaalHatanya()
3792         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
3793         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
3794         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
3795         *         documentation.
3796         */
3797        public Date getMinchaGedolaBaalHatanya() {
3798                return getMinchaGedola(getSunriseBaalHatanya(), getSunsetBaalHatanya());
3799        }
3800
3801        /**
3802         * This is a convenience method that returns the later of {@link #getMinchaGedolaBaalHatanya()} and
3803         * {@link #getMinchaGedola30Minutes()}. In the winter when 1/2 of a {@link #getShaahZmanisBaalHatanya()
3804         * <em>shaah zmanis</em>} is less than 30 minutes {@link #getMinchaGedola30Minutes()} will be returned, otherwise
3805         * {@link #getMinchaGedolaBaalHatanya()} will be returned.
3806         * 
3807         * @return the <code>Date</code> of the later of {@link #getMinchaGedolaBaalHatanya()} and {@link #getMinchaGedola30Minutes()}.
3808         *         If the calculation can't be computed such as in the Arctic Circle where there is at least one day a year
3809         *         where the sun does not rise, and one where it does not set, a null will be returned. See detailed
3810         *         explanation on top of the {@link AstronomicalCalendar} documentation.
3811         */
3812        public Date getMinchaGedolaBaalHatanyaGreaterThan30() {
3813                if (getMinchaGedola30Minutes() == null || getMinchaGedolaBaalHatanya() == null) {
3814                        return null;
3815                } else {
3816                        return getMinchaGedola30Minutes().compareTo(getMinchaGedolaBaalHatanya()) > 0 ? getMinchaGedola30Minutes()
3817                                        : getMinchaGedolaBaalHatanya();
3818                }
3819        }
3820
3821        /**
3822         * This method returns the time of <em>mincha ketana</em>. This is the preferred earliest time to pray
3823         * <em>mincha</em> in the opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> and others.
3824         * For more information on this see the documentation on {@link #getMinchaGedolaBaalHatanya() <em>mincha gedola</em>}.
3825         * This is calculated as 9.5 {@link #getShaahZmanisBaalHatanya()  sea level solar hours} after {@link #getSunriseBaalHatanya()
3826         * <em>netz amiti</em> (sunrise)}. This calculation is calculated based on the opinion of the Baal Hatanya that the
3827         * day is calculated from sunrise to sunset. This returns the time 9.5 * {@link #getShaahZmanisBaalHatanya()} after {@link
3828         * #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)}.
3829         * 
3830         * @see #getMinchaKetana(Date, Date)
3831         * @see #getShaahZmanisBaalHatanya()
3832         * @see #getMinchaGedolaBaalHatanya()
3833         * @return the <code>Date</code> of the time of <em>mincha ketana</em>. If the calculation can't be computed such as
3834         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
3835         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
3836         *         documentation.
3837         */
3838        public Date getMinchaKetanaBaalHatanya() {
3839                return getMinchaKetana(getSunriseBaalHatanya(), getSunsetBaalHatanya());
3840        }
3841
3842        /**
3843         * This method returns the time of <em>plag hamincha</em>. This is calculated as 10.75 hours after sunrise. This
3844         * calculation is based on the opinion of the Baal Hatanya that the day is calculated
3845         * from sunrise to sunset. This returns the time 10.75 * {@link #getShaahZmanisBaalHatanya()} after
3846         * {@link #getSunriseBaalHatanya() <em>netz amiti</em> (sunrise)}.
3847         * 
3848         * @see #getPlagHamincha(Date, Date)
3849         * @return the <code>Date</code> of the time of <em>plag hamincha</em>. If the calculation can't be computed such as
3850         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
3851         *         does not set, a null will be returned. See detailed explanation on top of the
3852         *         {@link AstronomicalCalendar} documentation.
3853         */
3854        public Date getPlagHaminchaBaalHatanya() {
3855                return getPlagHamincha(getSunriseBaalHatanya(), getSunsetBaalHatanya());
3856        }
3857
3858        /**
3859         * A method that returns <em>tzais</em> (nightfall) when the sun is 6&deg; below the western geometric horizon
3860         * (90&deg;) after {@link #getSunset sunset}. For information on the source of this calculation see
3861         * {@link #ZENITH_6_DEGREES}.
3862         * 
3863         * @return The <code>Date</code> of nightfall. If the calculation can't be computed such as northern and southern
3864         *         locations even south of the Arctic Circle and north of the Antarctic Circle where the sun may not reach
3865         *         low enough below the horizon for this calculation, a null will be returned. See detailed explanation on
3866         *         top of the {@link AstronomicalCalendar} documentation.
3867         * @see #ZENITH_6_DEGREES
3868         */
3869        public Date getTzaisBaalHatanya() {
3870                return this.getSunsetOffsetByDegrees(ZENITH_6_DEGREES);
3871        }
3872        
3873        /**
3874         * A utility methos to calculate zmanim based on <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe
3875         * Feinstein</a> as calculated in <a href="https://en.wikipedia.org/wiki/Mesivtha_Tifereth_Jerusalem">MTJ</a>, <a href=
3876         * "https://en.wikipedia.org/wiki/Mesivtha_Tifereth_Jerusalem">Yeshiva of Staten Island</a>, and Camp Yeshiva
3877         * of Staten Island. The day is split in two, from <em>alos</em> / sunrise to fixed local <em>chatzos</em>, and the
3878         * second half of the day, from fixed local <em>chatzos</em> to sunset / <em>tzais</em>. Morning based times are calculated
3879         * based on the first 6 hours, and afternoon times based on the second half of the day.
3880         * 
3881         * @param startOfHalfDay
3882         *            The start of the half day. This would be <em>alos</em> or sunrise for morning based times and fixed
3883         *            local <em>chatzos</em> for the second half of the day.
3884         * @param endOfHalfDay
3885         *            The end of the half day. This would be fixed local <em>chatzos</em> for morning based times and sunset
3886         *            or <em>tzais</em> for afternoon based times.
3887         * @param hours
3888         *            the number of hours to offset the beginning of the first or second half of the day
3889         * 
3890         * @return the <code>Date</code> of the later of {@link #getMinchaGedolaBaalHatanya()} and {@link #getMinchaGedola30Minutes()}.
3891         *         If the calculation can't be computed such as in the Arctic Circle where there is at least one day a year
3892         *         where the sun does not rise, and one where it does not set, a null will be returned. See detailed
3893         *         explanation on top of the {@link AstronomicalCalendar} documentation.
3894         *
3895         * @see ComplexZmanimCalendar#getFixedLocalChatzos()
3896         */
3897        public Date getFixedLocalChatzosBasedZmanim(Date startOfHalfDay, Date endOfHalfDay, double hours) {
3898                if (startOfHalfDay == null || endOfHalfDay == null) {
3899                        return null;
3900                }
3901                long shaahZmanis = (endOfHalfDay.getTime() - startOfHalfDay.getTime()) / 6;
3902                return new Date((long)(startOfHalfDay.getTime() + shaahZmanis * hours));
3903        }
3904        
3905        /**
3906         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of the
3907         * calculation of <em>sof zman krias shema</em> (latest time to recite <em>Shema</em> in the morning) according to the
3908         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> that the
3909         * day is calculated from dawn to nightfall, but calculated using the first half of the day only. The half a day starts
3910         * at <em>alos</em> defined as {@link #getAlos18Degrees() 18&deg;} and ends at {@link #getFixedLocalChatzos() fixed local
3911         * chatzos}. <em>Sof Zman Shema</em> is 3 <em>shaos zmaniyos</em> (solar hours) after <em>alos</em> or half of this half-day.
3912         * 
3913         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
3914         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
3915         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
3916         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3917         * @see #getAlos18Degrees()
3918         * @see #getFixedLocalChatzos()
3919         * @see #getFixedLocalChatzosBasedZmanim(Date, Date, double)
3920         */
3921        public Date getSofZmanShmaMGA18DegreesToFixedLocalChatzos() {
3922                return getFixedLocalChatzosBasedZmanim(getAlos18Degrees(), getFixedLocalChatzos(), 3);
3923        }
3924        
3925        /**
3926         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of the
3927         * calculation of <em>sof zman krias shema</em> (latest time to recite <em>Shema</em> in the morning) according to the
3928         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> that the
3929         * day is calculated from dawn to nightfall, but calculated using the first half of the day only. The half a day starts
3930         * at <em>alos</em> defined as {@link #getAlos16Point1Degrees() 16.1&deg;} and ends at {@link #getFixedLocalChatzos() fixed local
3931         * chatzos}. <em>Sof Zman Shema</em> is 3 <em>shaos zmaniyos</em> (solar hours) after this <em>alos</em> or half of this half-day.
3932         * 
3933         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
3934         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
3935         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
3936         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3937         * @see #getAlos16Point1Degrees()
3938         * @see #getFixedLocalChatzos()
3939         * @see #getFixedLocalChatzosBasedZmanim(Date, Date, double)
3940         */
3941        public Date getSofZmanShmaMGA16Point1DegreesToFixedLocalChatzos() {
3942                return getFixedLocalChatzosBasedZmanim(getAlos16Point1Degrees(), getFixedLocalChatzos(), 3);
3943        }
3944        
3945        /**
3946         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of the
3947         * calculation of <em>sof zman krias shema</em> (latest time to recite <em>Shema</em> in the morning) according to the
3948         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> that the
3949         * day is calculated from dawn to nightfall, but calculated using the first half of the day only. The half a day starts
3950         * at <em>alos</em> defined as {@link #getAlos90() 90 minutes before sunrise} and ends at {@link #getFixedLocalChatzos()
3951         * fixed local chatzos}. <em>Sof Zman Shema</em> is 3 <em>shaos zmaniyos</em> (solar hours) after this <em>alos</em> or
3952         * half of this half-day.
3953         * 
3954         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
3955         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
3956         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
3957         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3958         * @see #getAlos90()
3959         * @see #getFixedLocalChatzos()
3960         * @see #getFixedLocalChatzosBasedZmanim(Date, Date, double)
3961         */
3962        public Date getSofZmanShmaMGA90MinutesToFixedLocalChatzos() {
3963                return getFixedLocalChatzosBasedZmanim(getAlos90(), getFixedLocalChatzos(), 3);
3964        }
3965        
3966        /**
3967         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of the
3968         * calculation of <em>sof zman krias shema</em> (latest time to recite <em>Shema</em> in the morning) according to the
3969         * opinion of the <a href="https://en.wikipedia.org/wiki/Avraham_Gombinern">Magen Avraham (MGA)</a> that the
3970         * day is calculated from dawn to nightfall, but calculated using the first half of the day only. The half a day starts
3971         * at <em>alos</em> defined as {@link #getAlos72() 72 minutes before sunrise} and ends at {@link #getFixedLocalChatzos()
3972         * fixed local chatzos}. <em>Sof Zman Shema</em> is 3 <em>shaos zmaniyos</em> (solar hours) after this <em>alos</em> or
3973         * half of this half-day.
3974         * 
3975         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
3976         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
3977         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
3978         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3979         * @see #getAlos72()
3980         * @see #getFixedLocalChatzos()
3981         * @see #getFixedLocalChatzosBasedZmanim(Date, Date, double)
3982         */
3983        public Date getSofZmanShmaMGA72MinutesToFixedLocalChatzos() {
3984                return getFixedLocalChatzosBasedZmanim(getAlos72(), getFixedLocalChatzos(), 3);
3985        }
3986                
3987        /**
3988         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of the
3989         * calculation of <em>sof zman krias shema</em> (latest time to recite <em>Shema</em> in the morning) according to the
3990         * opinion of the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> that the day is calculated from
3991         * sunrise to sunset, but calculated using the first half of the day only. The half a day starts at {@link #getSunrise()
3992         * sunrise} and ends at {@link #getFixedLocalChatzos() fixed local chatzos}. <em>Sof zman Shema</em> is 3 <em>shaos
3993         * zmaniyos</em> (solar hours) after sunrise or half of this half-day.
3994         * 
3995         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
3996         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
3997         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
3998         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
3999         * @see #getSunrise()
4000         * @see #getFixedLocalChatzos()
4001         * @see #getFixedLocalChatzosBasedZmanim(Date, Date, double)
4002         */
4003        public Date getSofZmanShmaGRASunriseToFixedLocalChatzos() {
4004                return getFixedLocalChatzosBasedZmanim(getSunrise(), getFixedLocalChatzos(), 3);
4005        }
4006        
4007        /**
4008         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of the
4009         * calculation of <em>sof zman tfila</em> (<em>zman tfilah</em> (the latest time to recite the morning prayers))
4010         * according to the opinion of the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> that the day is
4011         * calculated from sunrise to sunset, but calculated using the first half of the day only. The half a day starts at
4012         * {@link #getSunrise() sunrise} and ends at {@link #getFixedLocalChatzos() fixed local chatzos}. <em>Sof zman tefila</em>
4013         * is 4 <em>shaos zmaniyos</em> (solar hours) after sunrise or 2/3 of this half-day.
4014         * 
4015         * @return the <code>Date</code> of the latest <em>zman krias shema</em>. If the calculation can't be computed such
4016         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
4017         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
4018         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
4019         * @see #getSunrise()
4020         * @see #getFixedLocalChatzos()
4021         * @see #getFixedLocalChatzosBasedZmanim(Date, Date, double)
4022         */
4023        public Date getSofZmanTfilaGRASunriseToFixedLocalChatzos() {
4024                return getFixedLocalChatzosBasedZmanim(getSunrise(), getFixedLocalChatzos(), 4);
4025        }
4026        
4027        /**
4028         * This method returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion of
4029         * the calculation of <em>mincha gedola</em>, the earliest time one can pray <em>mincha</em> <a href=
4030         * "https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a>that is 30 minutes after {@link #getFixedLocalChatzos() fixed
4031         * local chatzos}.
4032         * 
4033         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
4034         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
4035         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
4036         *         documentation.
4037         *         
4038         * @see #getMinchaGedola()
4039         * @see #getFixedLocalChatzos()
4040         * @see #getMinchaKetanaGRAFixedLocalChatzosToSunset
4041         */
4042        public Date getMinchaGedolaGRAFixedLocalChatzos30Minutes() {
4043                return getTimeOffset(getFixedLocalChatzos(), MINUTE_MILLIS * 30);
4044        }
4045        
4046        /**
4047         * This method returns returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion
4048         * of the calculation of <em>mincha ketana</em> (the preferred time to recite the <em>mincha prayers</em> according to
4049         * the opinion of the <a href="https://en.wikipedia.org/wiki/Maimonides">Rambam</a> and others) calculated according
4050         * to the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> that is 3.5 <em>shaos zmaniyos</em> (solar
4051         * hours) after {@link #getFixedLocalChatzos() fixed local chatzos}.
4052         * 
4053         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
4054         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
4055         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
4056         *         documentation.
4057         *         
4058         * @see #getMinchaGedola()
4059         * @see #getFixedLocalChatzos()
4060         * @see #getMinchaGedolaGRAFixedLocalChatzos30Minutes
4061         */
4062        public Date getMinchaKetanaGRAFixedLocalChatzosToSunset() {
4063                return getFixedLocalChatzosBasedZmanim(getFixedLocalChatzos(), getSunset(), 3.5);
4064        }
4065        
4066        /**
4067         * This method returns returns <a href="https://en.wikipedia.org/wiki/Moshe_Feinstein">Rav Moshe Feinstein's</a> opinion
4068         * of the calculation of <em>plag hamincha</em>. This method returns <em>plag hamincha</em> calculated according to the
4069         * <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> that the day ends at sunset and is 4.75 <em>shaos
4070         * zmaniyos</em> (solar hours) after {@link #getFixedLocalChatzos() fixed local chatzos}.
4071         * 
4072         * @return the <code>Date</code> of the time of <em>mincha gedola</em>. If the calculation can't be computed such as
4073         *         in the Arctic Circle where there is at least one day a year where the sun does not rise, and one where it
4074         *         does not set, a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
4075         *         documentation.
4076         *         
4077         * @see #getPlagHamincha()
4078         * @see #getFixedLocalChatzos()
4079         * @see #getMinchaKetanaGRAFixedLocalChatzosToSunset
4080         * @see #getMinchaGedolaGRAFixedLocalChatzos30Minutes
4081         */
4082        public Date getPlagHaminchaGRAFixedLocalChatzosToSunset() {
4083                return getFixedLocalChatzosBasedZmanim(getFixedLocalChatzos(), getSunset(), 4.75);
4084        }
4085        
4086        /**
4087         * Method to return <em>tzais</em> (dusk) calculated as 50 minutes after sea level sunset. This method returns
4088         * <em>tzais</em> (nightfall) based on the opinion of Rabbi Moshe Feinstein for the New York area. This time should
4089         * not be used for latitudes different than the NY area.
4090         * 
4091         * @return the <code>Date</code> representing the time. If the calculation can't be computed such as in the Arctic
4092         *         Circle where there is at least one day a year where the sun does not rise, and one where it does not set,
4093         *         a null will be returned. See detailed explanation on top of the {@link AstronomicalCalendar}
4094         *         documentation.
4095         */
4096        public Date getTzais50() {
4097                return getTimeOffset(getElevationAdjustedSunset(), 50 * MINUTE_MILLIS);
4098        }
4099        
4100        /**
4101         * A method for calculating <em>samuch lemincha ketana</em>, / near <em>mincha ketana</em> time that is half an hour before
4102         * {@link #getMinchaKetana()} or is 9 * {@link #getShaahZmanisGra() <em>shaos zmaniyos</em>} (solar hours) after {@link
4103         * #getSunrise() sunrise} or {@link #getSeaLevelSunrise() sea level sunrise} (depending on the {@link #isUseElevation()}
4104         * setting), calculated according to the <a href="https://en.wikipedia.org/wiki/Vilna_Gaon">GRA</a> using a day starting at
4105         * sunrise and ending at sunset. This is the time that eating or other activity can't begin prior to praying <em>mincha</em>.
4106         * The calculation used is 9 * {@link #getShaahZmanis16Point1Degrees()} after {@link #getAlos16Point1Degrees() <em>alos</em>
4107         * 16.1&deg;}. See the <a href="https://hebrewbooks.org/pdfpager.aspx?req=60387&st=&pgnum=294">Mechaber and Mishna Berurah
4108         * 232</a> for details.
4109         * 
4110         * @see #getShaahZmanisGra()
4111         * @see #getSamuchLeMinchaKetana16Point1Degrees()
4112         * @return the <code>Date</code> of the time of <em>samuch lemincha ketana</em>. If the calculation can't be computed such
4113         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
4114         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
4115         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
4116         */
4117        public Date getSamuchLeMinchaKetanaGRA() {
4118                return getSamuchLeMinchaKetana(getElevationAdjustedSunrise(), getElevationAdjustedSunset());
4119        }
4120        
4121        /**
4122         * A method for calculating <em>samuch lemincha ketana</em>, / near <em>mincha ketana</em> time that is half an hour before
4123         * {@link #getMinchaGedola16Point1Degrees()}  or 9 * <em>shaos zmaniyos</em> (temporal hours) after the start of the day,
4124         * calculated using a day starting and ending 16.1&deg; below the horizon. This is the time that eating or other activity
4125         * can't begin prior to praying <em>mincha</em>. The calculation used is 9 * {@link #getShaahZmanis16Point1Degrees()} after
4126         * {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;}. See the <a href=
4127         * "https://hebrewbooks.org/pdfpager.aspx?req=60387&st=&pgnum=294">Mechaber and Mishna Berurah 232</a>.
4128         * 
4129         * @see #getShaahZmanis16Point1Degrees()
4130         * @return the <code>Date</code> of the time of <em>samuch lemincha ketana</em>. If the calculation can't be computed such
4131         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
4132         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
4133         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
4134         */
4135        public Date getSamuchLeMinchaKetana16Point1Degrees() {
4136                return getSamuchLeMinchaKetana(getAlos16Point1Degrees(), getTzais16Point1Degrees());
4137        }
4138        
4139        /**
4140         * A method for calculating <em>samuch lemincha ketana</em>, / near <em>mincha ketana</em> time that is half an hour before
4141         * {@link #getMinchaKetana72Minutes()}  or 9 * <em>shaos zmaniyos</em> (temporal hours) after the start of the day,
4142         * calculated using a day starting 72 minutes before sunrise and ending 72 minutes after sunset. This is the time that eating
4143         * or other activity can't begin prior to praying <em>mincha</em>. The calculation used is 9 * {@link
4144         * #getShaahZmanis16Point1Degrees()} after {@link #getAlos16Point1Degrees() <em>alos</em> 16.1&deg;}. See the <a href=
4145         * "https://hebrewbooks.org/pdfpager.aspx?req=60387&st=&pgnum=294">Mechaber and Mishna Berurah 232</a>.
4146         * 
4147         * @see #getShaahZmanis16Point1Degrees()
4148         * @return the <code>Date</code> of the time of <em>samuch lemincha ketana</em>. If the calculation can't be computed such
4149         *         as northern and southern locations even south of the Arctic Circle and north of the Antarctic Circle
4150         *         where the sun may not reach low enough below the horizon for this calculation, a null will be returned.
4151         *         See detailed explanation on top of the {@link AstronomicalCalendar} documentation.
4152         */
4153        public Date getSamuchLeMinchaKetana72Minutes() {
4154                return getSamuchLeMinchaKetana(getAlos72(), getTzais72());
4155        }
4156}