001 /*
002 * Zmanim Java API
003 * Copyright (C) 2004-2010 Eliyahu Hershfeld
004 *
005 * This program is free software; you can redistribute it and/or modify it under the terms of the
006 * GNU General Public License as published by the Free Software Foundation; either version 2 of the
007 * License, or (at your option) any later version.
008 *
009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
010 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
011 * General Public License for more details.
012 *
013 * You should have received a copy of the GNU General Public License along with this program; if
014 * not, write to the Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA
015 * 02111-1307, USA or connect to: http://www.fsf.org/copyleft/gpl.html
016 */
017 package net.sourceforge.zmanim;
018
019 import java.util.Date;
020
021 import net.sourceforge.zmanim.util.AstronomicalCalculator;
022 import net.sourceforge.zmanim.util.GeoLocation;
023
024 /**
025 * This class extends ZmanimCalendar and provides many more zmanim than
026 * available in the ZmanimCalendar. The basis for most zmanim in this class are
027 * from the <em>sefer</em> <b>Yisroel Vehazmanim</b> by <b>Rabbi Yisroel Dovid
028 * Harfenes</b>. <br />
029 * For an example of the number of different <em>zmanim</em> made available by
030 * this class, there are methods to return 12 different calculations for
031 * <em>alos</em> (dawn) available in this class. The real power of this API is
032 * the ease in calculating <em>zmanim</em> that are not part of the API. The
033 * methods for doing <em>zmanim</em> calculations not present in this or it's
034 * superclass the {@link ZmanimCalendar} are contained in the
035 * {@link AstronomicalCalendar}, the base class of the calendars in our API
036 * since they are generic methods for calculating time based on degrees or time
037 * before or after {@link #getSunrise sunrise} and {@link #getSunset sunset} and
038 * are of interest for calculation beyond <em>zmanim</em> calculations. Here are
039 * some examples: <br />
040 * First create the Calendar for the location you would like to calculate:
041 *
042 * <pre>
043 * String locationName = "Lakewood, NJ";
044 * double latitude = 40.0828; //Lakewood, NJ
045 * double longitude = -74.2094; //Lakewood, NJ
046 * double elevation = 0;
047 * //the String parameter in getTimeZone() has to be a valid timezone listed in {@link java.util.TimeZone#getAvailableIDs()}
048 * TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
049 * GeoLocation location = new GeoLocation(locationName, latitude, longitude,
050 * elevation, timeZone);
051 * ComplexZmanimCalendar czc = new ComplexZmanimCalendar(location);
052 * </pre>
053 *
054 * Note: For locations such as Israel where the beginning and end of daylight
055 * savings time can fluctuate from year to year create a
056 * {@link java.util.SimpleTimeZone} with the known start and end of DST. <br />
057 * To get alos calculated as 14° below the horizon (as calculated in the
058 * calendars published in Montreal) use:
059 *
060 * <pre>
061 * Date alos14 = czc.getSunriseOffsetByDegrees(14);
062 * </pre>
063 *
064 * To get <em>mincha gedola</em> calculated based on the MGA using a <em>shaah
065 * zmanis</em> based on the day starting 16.1° below the horizon (and ending
066 * 16.1° after sunset the following calculation can be used:
067 *
068 * <pre>
069 * Date minchaGedola = czc.getTimeOffset(czc.getAlos16point1Degrees(), czc
070 * .getShaahZmanis16Point1Degrees() * 6.5);
071 * </pre>
072 *
073 * A little more complex example would be calculating <em>plag hamincha</em>
074 * based on a shaah zmanis that was not present in this class. While a drop more
075 * complex it is still rather easy. For example if you wanted to calculate
076 * <em>plag</em> based on the day starting 12° before sunrise and ending
077 * 12° after sunset as calculated in the calendars in Manchester, England
078 * (there is nothing that would prevent your calculating the day using sunrise
079 * and sunset offsets that are not identical degrees, but this would lead to
080 * chatzos being a time other than the {@link #getSunTransit() solar transit}
081 * (solar midday)). The steps involved would be to first calculate the
082 * <em>shaah zmanis</em> and than use that time in milliseconds to calculate
083 * 10.75 hours after sunrise starting at 12° before sunset
084 *
085 * <pre>
086 * long shaahZmanis = czc.getTemporalHour(czc.getSunriseOffsetByDegrees(12), czc
087 * .getSunsetOffsetByDegrees(12));
088 * Date plag = getTimeOffset(czc.getSunriseOffsetByDegrees(12),
089 * shaahZmanis * 10.75);
090 * </pre>
091 *
092 * <h2>Disclaimer:</h2> While I did my best to get accurate results please do
093 * not rely on these zmanim for <em>halacha lemaaseh</em>
094 *
095 * @author © Eliyahu Hershfeld 2004 - 2010
096 * @version 1.2
097 */
098 public class ComplexZmanimCalendar extends ZmanimCalendar {
099 private static final long serialVersionUID = 1;
100
101 /**
102 * The zenith of 3.7° below {@link #GEOMETRIC_ZENITH geometric zenith}
103 * (90°). This calculation is used for calculating <em>tzais</em>
104 * (nightfall) according to some opinions. This calculation is based on the
105 * opinion of the Geonim that <em>tzais</em> is the time it takes to walk
106 * 3/4 of a Mil at 18 minutes a Mil, or 13.5 minutes after sunset. The sun
107 * is 3.7° below {@link #GEOMETRIC_ZENITH geometric zenith} at this time
108 * in Jerusalem on March 16, about 4 days before the equinox, the day that a
109 * solar hour is one hour.
110 *
111 * TODO AT see #getTzaisGeonim3Point7Degrees()
112 */
113 protected static final double ZENITH_3_POINT_7 = GEOMETRIC_ZENITH + 3.7;
114
115 /**
116 * The zenith of 5.95° below {@link #GEOMETRIC_ZENITH geometric zenith}
117 * (90°). This calculation is used for calculating <em>tzais</em>
118 * (nightfall) according to some opinions. This calculation is based on the
119 * position of the sun 24 minutes after sunset in Jerusalem on March 16,
120 * about 4 days before the equinox, the day that a solar hour is one hour,
121 * which calculates to 5.95° below {@link #GEOMETRIC_ZENITH geometric
122 * zenith}
123 *
124 * @see #getTzaisGeonim5Point95Degrees()
125 */
126 protected static final double ZENITH_5_POINT_95 = GEOMETRIC_ZENITH + 5.95;
127
128 /**
129 * The zenith of 7.083° below {@link #GEOMETRIC_ZENITH geometric zenith}
130 * (90°). This is often referred to as 7°5' or 7° and 5 minutes.
131 * This calculation is used for calculating <em>alos</em> (dawn) and
132 * <em>tzais</em> (nightfall) according to some opinions. This calculation
133 * is based on the position of the sun 30 minutes after sunset in Jerusalem
134 * on March 16, about 4 days before the equinox, the day that a solar hour
135 * is one hour, which calculates to 7.0833333° below
136 * {@link #GEOMETRIC_ZENITH geometric zenith}. This is time some opinions
137 * consider dark enough for 3 stars to be visible. This is the opinion of
138 * the Shu"t Melamed Leho'il, Shu"t Binyan Tziyon, Tenuvas Sadeh and very
139 * close to the time of the Mekor Chesed on the Sefer chasidim.
140 *
141 * @see #getTzaisGeonim7Point083Degrees()
142 * @see #getBainHasmashosRT13Point5MinutesBefore7Point083Degrees()
143 */
144 protected static final double ZENITH_7_POINT_083 = GEOMETRIC_ZENITH + 7
145 + (5 / 60);
146
147 /**
148 * The zenith of 10.2° below {@link #GEOMETRIC_ZENITH geometric zenith}
149 * (90°). This calculation is used for calculating <em>misheyakir</em>
150 * according to some opinions. This calculation is based on the position of
151 * the sun 45 minutes before {@link #getSunrise sunrise} in Jerusalem on
152 * March 16, about 4 days before the equinox, the day that a solar hour is
153 * one hour which calculates to 10.2° below {@link #GEOMETRIC_ZENITH
154 * geometric zenith}
155 *
156 * @see #getMisheyakir10Point2Degrees()
157 */
158 protected static final double ZENITH_10_POINT_2 = GEOMETRIC_ZENITH + 10.2;
159
160 /**
161 * The zenith of 11° below {@link #GEOMETRIC_ZENITH geometric zenith}
162 * (90°). This calculation is used for calculating <em>misheyakir</em>
163 * according to some opinions. This calculation is based on the position of
164 * the sun 48 minutes before {@link #getSunrise sunrise} in Jerusalem on
165 * March 16, about 4 days before the equinox, the day that a solar hour is
166 * one hour which calculates to 11° below {@link #GEOMETRIC_ZENITH
167 * geometric zenith}
168 *
169 * @see #getMisheyakir11Degrees()
170 */
171 protected static final double ZENITH_11_DEGREES = GEOMETRIC_ZENITH + 11;
172
173 /**
174 * The zenith of 11.5° below {@link #GEOMETRIC_ZENITH geometric zenith}
175 * (90°). This calculation is used for calculating <em>misheyakir</em>
176 * according to some opinions. This calculation is based on the position of
177 * the sun 52 minutes before {@link #getSunrise sunrise} in Jerusalem on
178 * March 16, about 4 days before the equinox, the day that a solar hour is
179 * one hour which calculates to 11.5° below {@link #GEOMETRIC_ZENITH
180 * geometric zenith}
181 *
182 * @see #getMisheyakir11Point5Degrees()
183 */
184 protected static final double ZENITH_11_POINT_5 = GEOMETRIC_ZENITH + 11.5;
185
186 /**
187 * The zenith of 13° below {@link #GEOMETRIC_ZENITH geometric zenith}
188 * (90°). This calculation is used for calculating
189 * <em>Rabainu Tam's bain hashmashos</em> according to some opinions. <br/>
190 * <br/>
191 * <b>FIXME:</b> See comments on {@link #getBainHasmashosRT13Degrees}. This
192 * should be changed to 13.2477 after confirmation.
193 *
194 * @see #getBainHasmashosRT13Degrees
195 *
196 */
197 protected static final double ZENITH_13_DEGREES = GEOMETRIC_ZENITH + 13;
198
199 /**
200 * The zenith of 19.8° below {@link #GEOMETRIC_ZENITH geometric zenith}
201 * (90°). This calculation is used for calculating <em>alos</em> (dawn)
202 * and <em>tzais</em> (nightfall) according to some opinions. This
203 * calculation is based on the position of the sun 90 minutes after sunset
204 * in Jerusalem on March 16, about 4 days before the equinox, the day that a
205 * solar hour is one hour which calculates to 19.8° below
206 * {@link #GEOMETRIC_ZENITH geometric zenith}
207 *
208 * @see #getTzais19Point8Degrees()
209 * @see #getAlos19Point8Degrees()
210 * @see #getAlos90()
211 * @see #getTzais90()
212 */
213 protected static final double ZENITH_19_POINT_8 = GEOMETRIC_ZENITH + 19.8;
214
215 /**
216 * The zenith of 26° below {@link #GEOMETRIC_ZENITH geometric zenith}
217 * (90°). This calculation is used for calculating <em>alos</em> (dawn)
218 * and <em>tzais</em> (nightfall) according to some opinions. This
219 * calculation is based on the position of the sun {@link #getAlos120() 120
220 * minutes} after sunset in Jerusalem on March 16, about 4 days before the
221 * equinox, the day that a solar hour is one hour which calculates to
222 * 26° below {@link #GEOMETRIC_ZENITH geometric zenith}
223 *
224 * @see #getAlos26Degrees()
225 * @see #getTzais26Degrees()
226 * @see #getAlos120()
227 * @see #getTzais120()
228 */
229 protected static final double ZENITH_26_DEGREES = GEOMETRIC_ZENITH + 26.0;
230
231 private double ateretTorahSunsetOffset = 40;
232
233 public ComplexZmanimCalendar(GeoLocation location) {
234 super(location);
235 }
236
237 /**
238 * Default constructor will set a default {@link GeoLocation#GeoLocation()},
239 * a default {@link AstronomicalCalculator#getDefault()
240 * AstronomicalCalculator} and default the calendar to the current date.
241 *
242 * @see AstronomicalCalendar#AstronomicalCalendar()
243 */
244 public ComplexZmanimCalendar() {
245 super();
246 }
247
248 /**
249 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
250 * a 19.8° dip. This calculation divides the day based on the opinion of
251 * the MGA that the day runs from dawn to dusk. Dawn for this calculation is
252 * when the sun is 19.8° below the eastern geometric horizon before
253 * sunrise. Dusk for this is when the sun is 19.8° below the western
254 * geometric horizon after sunset. This day is split into 12 equal parts
255 * with each part being a <em>shaah zmanis</em>.
256 *
257 * @return the <code>long</code> millisecond length of a
258 * <em>shaah zmanis</em>.
259 */
260 public long getShaahZmanis19Point8Degrees() {
261 return getTemporalHour(getAlos19Point8Degrees(),
262 getTzais19Point8Degrees());
263 }
264
265 /**
266 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
267 * a 18° dip. This calculation divides the day based on the opinion of
268 * the MGA that the day runs from dawn to dusk. Dawn for this calculation is
269 * when the sun is 18° below the eastern geometric horizon before
270 * sunrise. Dusk for this is when the sun is 18° below the western
271 * geometric horizon after sunset. This day is split into 12 equal parts
272 * with each part being a <em>shaah zmanis</em>.
273 *
274 * @return the <code>long</code> millisecond length of a
275 * <em>shaah zmanis</em>.
276 */
277 public long getShaahZmanis18Degrees() {
278 return getTemporalHour(getAlos18Degrees(), getTzais18Degrees());
279 }
280
281 /**
282 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
283 * a dip of 26°. This calculation divides the day based on the opinion
284 * of the MGA that the day runs from dawn to dusk. Dawn for this calculation
285 * is when the sun is {@link #getAlos26Degrees() 26°} below the eastern
286 * geometric horizon before sunrise. Dusk for this is when the sun is
287 * {@link #getTzais26Degrees() 26°} below the western geometric horizon
288 * after sunset. This day is split into 12 equal parts with each part being
289 * a <em>shaah zmanis</em>.
290 *
291 * @return the <code>long</code> millisecond length of a
292 * <em>shaah zmanis</em>.
293 */
294 public long getShaahZmanis26Degrees() {
295 return getTemporalHour(getAlos26Degrees(), getTzais26Degrees());
296 }
297
298 /**
299 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
300 * a dip of 16.1°. This calculation divides the day based on the opinion
301 * that the day runs from dawn to dusk. Dawn for this calculation is when
302 * the sun is 16.1° below the eastern geometric horizon before sunrise
303 * and dusk is when the sun is 16.1° below the western geometric horizon
304 * after sunset. This day is split into 12 equal parts with each part being
305 * a <em>shaah zmanis</em>.
306 *
307 * @return the <code>long</code> millisecond length of a
308 * <em>shaah zmanis</em>.
309 * @see #getAlos16Point1Degrees()
310 * @see #getTzais16Point1Degrees()
311 * @see #getSofZmanShmaMGA16Point1Degrees()
312 * @see #getSofZmanTfilaMGA16Point1Degrees()
313 * @see #getMinchaGedola16Point1Degrees()
314 * @see #getMinchaKetana16Point1Degrees()
315 * @see #getPlagHamincha16Point1Degrees()
316 */
317
318 public long getShaahZmanis16Point1Degrees() {
319 return getTemporalHour(getAlos16Point1Degrees(),
320 getTzais16Point1Degrees());
321 }
322
323 /**
324 * Method to return a <em>shaah zmanis</em> (solar hour) according to the
325 * opinion of the MGA. This calculation divides the day based on the opinion
326 * of the <em>MGA</em> that the day runs from dawn to dusk. Dawn for this
327 * calculation is 60 minutes before sunrise and dusk is 60 minutes after
328 * sunset. This day is split into 12 equal parts with each part being a
329 * <em>shaah zmanis</em>. Alternate mothods of calculating a
330 * <em>shaah zmanis</em> are available in the subclass
331 * {@link ComplexZmanimCalendar}
332 *
333 * @return the <code>long</code> millisecond length of a
334 * <em>shaah zmanis</em>.
335 */
336 public long getShaahZmanis60Minutes() {
337 return getTemporalHour(getAlos60(), getTzais60());
338 }
339
340 /**
341 * Method to return a <em>shaah zmanis</em> (solar hour) according to the
342 * opinion of the MGA. This calculation divides the day based on the opinion
343 * of the <em>MGA</em> that the day runs from dawn to dusk. Dawn for this
344 * calculation is 72 minutes before sunrise and dusk is 72 minutes after
345 * sunset. This day is split into 12 equal parts with each part being a
346 * <em>shaah zmanis</em>. Alternate mothods of calculating a
347 * <em>shaah zmanis</em> are available in the subclass
348 * {@link ComplexZmanimCalendar}
349 *
350 * @return the <code>long</code> millisecond length of a
351 * <em>shaah zmanis</em>.
352 */
353 public long getShaahZmanis72Minutes() {
354 return getShaahZmanisMGA();
355 }
356
357 /**
358 * Method to return a <em>shaah zmanis</em> (temporal hour) according to the
359 * opinion of the MGA based on <em>alos</em> being
360 * {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em> before
361 * {@link #getSunrise() sunrise}. This calculation divides the day based on
362 * the opinion of the <em>MGA</em> that the day runs from dawn to dusk. Dawn
363 * for this calculation is 72 minutes <em>zmaniyos</em> before sunrise and
364 * dusk is 72 minutes <em>zmaniyos</em> after sunset. This day is split into
365 * 12 equal parts with each part being a <em>shaah zmanis</em>. This is
366 * identical to 1/10th of the day from {@link #getSunrise() sunrise} to
367 * {@link #getSunset() sunset}.
368 *
369 * @return the <code>long</code> millisecond length of a
370 * <em>shaah zmanis</em>.
371 * @see #getAlos72Zmanis()
372 * @see #getTzais72Zmanis()
373 */
374 public long getShaahZmanis72MinutesZmanis() {
375 return getTemporalHour(getAlos72Zmanis(), getTzais72Zmanis());
376 }
377
378 /**
379 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
380 * a dip of 90 minutes. This calculation divides the day based on the
381 * opinion of the MGA that the day runs from dawn to dusk. Dawn for this
382 * calculation is 90 minutes before sunrise and dusk is 90 minutes after
383 * sunset. This day is split into 12 equal parts with each part being a
384 * <em>shaah zmanis</em>.
385 *
386 * @return the <code>long</code> millisecond length of a
387 * <em>shaah zmanis</em>.
388 */
389 public long getShaahZmanis90Minutes() {
390 return getTemporalHour(getAlos90(), getTzais90());
391 }
392
393 /**
394 * Method to return a <em>shaah zmanis</em> (temporal hour) according to the
395 * opinion of the MGA based on <em>alos</em> being
396 * {@link #getAlos90Zmanis() 90} minutes <em>zmaniyos</em> before
397 * {@link #getSunrise() sunrise}. This calculation divides the day based on
398 * the opinion of the <em>MGA</em> that the day runs from dawn to dusk. Dawn
399 * for this calculation is 90 minutes <em>zmaniyos</em> before sunrise and
400 * dusk is 90 minutes <em>zmaniyos</em> after sunset. This day is split into
401 * 12 equal parts with each part being a <em>shaah zmanis</em>. This is
402 * identical to 1/8th of the day from {@link #getSunrise() sunrise} to
403 * {@link #getSunset() sunset}.
404 *
405 * @return the <code>long</code> millisecond length of a
406 * <em>shaah zmanis</em>.
407 * @see #getAlos90Zmanis()
408 * @see #getTzais90Zmanis()
409 */
410 public long getShaahZmanis90MinutesZmanis() {
411 return getTemporalHour(getAlos90Zmanis(), getTzais90Zmanis());
412 }
413
414 /**
415 * Method to return a <em>shaah zmanis</em> (temporal hour) according to the
416 * opinion of the MGA based on <em>alos</em> being
417 * {@link #getAlos96Zmanis() 96} minutes <em>zmaniyos</em> before
418 * {@link #getSunrise() sunrise}. This calculation divides the day based on
419 * the opinion of the <em>MGA</em> that the day runs from dawn to dusk. Dawn
420 * for this calculation is 96 minutes <em>zmaniyos</em> before sunrise and
421 * dusk is 96 minutes <em>zmaniyos</em> after sunset. This day is split into
422 * 12 equal parts with each part being a <em>shaah zmanis</em>. This is
423 * identical to 1/7.5th of the day from {@link #getSunrise() sunrise} to
424 * {@link #getSunset() sunset}.
425 *
426 * @return the <code>long</code> millisecond length of a
427 * <em>shaah zmanis</em>.
428 * @see #getAlos96Zmanis()
429 * @see #getTzais96Zmanis()
430 */
431 public long getShaahZmanis96MinutesZmanis() {
432 return getTemporalHour(getAlos96Zmanis(), getTzais96Zmanis());
433 }
434
435 /**
436 * Method to return a <em>shaah zmanis</em> (temporal hour) according to the
437 * opinion of the Chacham Yosef Harari-Raful of Yeshivat Ateret Torah
438 * calculated with <em>alos</em> being 1/10th of sunrise to sunset day, or
439 * {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em> of such a day
440 * before {@link #getSunrise() sunrise}, and tzais is usually calculated as
441 * {@link #getTzaisAteretTorah() 40 minutes} after {@link #getSunset()
442 * sunset}. This day is split into 12 equal parts with each part being a
443 * <em>shaah zmanis</em>. Note that with this system, chatzos (mid-day) will
444 * not be the point that the sun is {@link #getSunTransit() halfway across
445 * the sky}.
446 *
447 * @return the <code>long</code> millisecond length of a
448 * <em>shaah zmanis</em>.
449 * @see #getAlos72Zmanis()
450 * @see #getTzaisAteretTorah()
451 * @see #getAteretTorahSunsetOffset()
452 * @see #setAteretTorahSunsetOffset(double)
453 */
454 public long getShaahZmanisAteretTorah() {
455 return getTemporalHour(getAlos72Zmanis(), getTzaisAteretTorah());
456 }
457
458 /**
459 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
460 * a dip of 96 minutes. This calculation divides the day based on the
461 * opinion of the MGA that the day runs from dawn to dusk. Dawn for this
462 * calculation is 96 minutes before sunrise and dusk is 96 minutes after
463 * sunset. This day is split into 12 equal parts with each part being a
464 * <em>shaah zmanis</em>.
465 *
466 * @return the <code>long</code> millisecond length of a
467 * <em>shaah zmanis</em>.
468 */
469 public long getShaahZmanis96Minutes() {
470 return getTemporalHour(getAlos96(), getTzais96());
471 }
472
473 /**
474 * Method to return a <em>shaah zmanis</em> (temporal hour) calculated using
475 * a dip of 120 minutes. This calculation divides the day based on the
476 * opinion of the MGA that the day runs from dawn to dusk. Dawn for this
477 * calculation is 120 minutes before sunrise and dusk is 120 minutes after
478 * sunset. This day is split into 12 equal parts with each part being a
479 * <em>shaah zmanis</em>.
480 *
481 * @return the <code>long</code> millisecond length of a
482 * <em>shaah zmanis</em>.
483 */
484 public long getShaahZmanis120Minutes() {
485 return getTemporalHour(getAlos120(), getTzais120());
486 }
487
488 /**
489 * Method to return a <em>shaah zmanis</em> (temporal hour) according to the
490 * opinion of the MGA based on <em>alos</em> being
491 * {@link #getAlos120Zmanis() 120} minutes <em>zmaniyos</em> before
492 * {@link #getSunrise() sunrise}. This calculation divides the day based on
493 * the opinion of the <em>MGA</em> that the day runs from dawn to dusk. Dawn
494 * for this calculation is 120 minutes <em>zmaniyos</em> before sunrise and
495 * dusk is 120 minutes <em>zmaniyos</em> after sunset. This day is split
496 * into 12 equal parts with each part being a <em>shaah zmanis</em>. This is
497 * identical to 1/6th of the day from {@link #getSunrise() sunrise} to
498 * {@link #getSunset() sunset}.
499 *
500 * @return the <code>long</code> millisecond length of a
501 * <em>shaah zmanis</em>.
502 * @see #getAlos120Zmanis()
503 * @see #getTzais120Zmanis()
504 */
505 public long getShaahZmanis120MinutesZmanis() {
506 return getTemporalHour(getAlos120Zmanis(), getTzais120Zmanis());
507 }
508
509 /**
510 * This method returns the time of <em>plag hamincha</em>. This is
511 * calculated as 10.75 hours after {@link #getAlos96Zmanis() dawn}. The
512 * formula used is:<br/>
513 * 10.75 * {@link #getShaahZmanis96MinutesZmanis()} after
514 * {@link #getAlos96Zmanis() dawn}.
515 *
516 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
517 */
518 public Date getPlagHamincha120MinutesZmanis() {
519 return getTimeOffset(getAlos120Zmanis(),
520 getShaahZmanis120MinutesZmanis() * 10.75);
521 }
522
523 /**
524 * This method returns the time of <em>plag hamincha</em>. This is
525 * calculated as 10.75 hours after {@link #getAlos72() dawn}. The formula
526 * used is:<br/>
527 * 10.75 {@link #getShaahZmanis72Minutes()} after {@link #getAlos72()}.
528 *
529 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
530 */
531 public Date getPlagHamincha120Minutes() {
532 return getTimeOffset(getAlos120(), getShaahZmanis120Minutes() * 10.75);
533 }
534
535 /**
536 * Method to return <em>alos</em> (dawn) calculated using 60 minutes before
537 * {@link #getSeaLevelSunrise() sea level sunrise} on the time to walk the
538 * distance of 4 <em>Mil</em> at 15 minutes a <em>Mil</em> (the opinion of
539 * the Chavas Yair. See the Divray Malkiel). This is based on the opinion of
540 * most <em>Rishonim</em> who stated that the time of the <em>Neshef</em>
541 * (time between dawn and sunrise) does not vary by the time of year or
542 * location but purely depends on the time it takes to walk the distance of
543 * 4 <em>Mil</em>.
544 *
545 * @return the <code>Date</code> representing the time.
546 */
547 public Date getAlos60() {
548 return getTimeOffset(getSeaLevelSunrise(), -60 * MINUTE_MILLIS);
549 }
550
551 /**
552 * Method to return <em>alos</em> (dawn) calculated using 72 minutes
553 * <em>zmaniyos</em>( <em>GR"A</em> and the <em>Baal Hatanya</em>) or 1/10th
554 * of the day before sea level sunrise. This is based on an 18 minute
555 * <em>Mil</em> so the time for 4 <em>Mil</em> is 72 minutes which is 1/10th
556 * of a day (12 * 60 = 720) based on the day starting at
557 * {@link #getSeaLevelSunrise() sea level sunrise} and ending at
558 * {@link #getSeaLevelSunset() sea level sunset}. The actual alculation is
559 * {@link #getSeaLevelSunrise()}- ( {@link #getShaahZmanisGra()} * 1.2).
560 * This calculation is used in the calendars published by
561 * <em>Hisachdus Harabanim D'Artzos Habris Ve'Kanada</em>
562 *
563 * @return the <code>Date</code> representing the time.
564 * @see #getShaahZmanisGra()
565 */
566 public Date getAlos72Zmanis() {
567 long shaahZmanis = getShaahZmanisGra();
568 if (shaahZmanis == Long.MIN_VALUE) {
569 return null;
570 }
571 return getTimeOffset(getSeaLevelSunrise(), (long) (shaahZmanis * -1.2));
572 }
573
574 /**
575 * Method to return <em>alos</em> (dawn) calculated using 96 minutes before
576 * {@link #getSeaLevelSunrise() sea level sunrise} based on the time to walk
577 * the distance of 4 <em>Mil</em> at 24 minutes a <em>Mil</em>. This is
578 * based on the opinion of most <em>Rishonim</em> who stated that the time
579 * of the <em>Neshef</em> (time between dawn and sunrise) does not vary by
580 * the time of year or location but purely depends on the time it takes to
581 * walk the distance of 4 <em>Mil</em>.
582 *
583 * @return the <code>Date</code> representing the time.
584 */
585 public Date getAlos96() {
586 return getTimeOffset(getSeaLevelSunrise(), -96 * MINUTE_MILLIS);
587 }
588
589 /**
590 * Method to return <em>alos</em> (dawn) calculated using 90 minutes
591 * <em>zmaniyos</em>( <em>GR"A</em> and the <em>Baal Hatanya</em>) or 1/8th
592 * of the day before sea level sunrise. This is based on a 22.5 minute
593 * <em>Mil</em> so the time for 4 <em>Mil</em> is 90 minutes which is 1/8th
594 * of a day (12 * 60 = 720) /8 =90 based on the day starting at
595 * {@link #getSunrise() sunrise} and ending at {@link #getSunset() sunset}.
596 * The actual calculation is {@link #getSunrise()} - (
597 * {@link #getShaahZmanisGra()} * 1.5).
598 *
599 * @return the <code>Date</code> representing the time.
600 * @see #getShaahZmanisGra()
601 */
602 public Date getAlos90Zmanis() {
603 long shaahZmanis = getShaahZmanisGra();
604 if (shaahZmanis == Long.MIN_VALUE) {
605 return null;
606 }
607 return getTimeOffset(getSeaLevelSunrise(), (long) (shaahZmanis * -1.5));
608 }
609
610 /**
611 * Method to return <em>alos</em> (dawn) calculated using 90 minutes
612 * <em>zmaniyos</em>( <em>GR"A</em> and the <em>Baal Hatanya</em>) or 1/8th
613 * of the day before sea level sunrise. This is based on a 24 minute
614 * <em>Mil</em> so the time for 4 <em>Mil</em> is 90 minutes which is
615 * 1/7.5th of a day (12 * 60 = 720) / 7.5 =96 based on the day starting at
616 * {@link #getSunrise() sunrise} and ending at {@link #getSunset() sunset}.
617 * The actual calculation is {@link #getSunrise()} - (
618 * {@link #getShaahZmanisGra()} * 1.6).
619 *
620 * @return the <code>Date</code> representing the time.
621 * @see #getShaahZmanisGra()
622 */
623 public Date getAlos96Zmanis() {
624 long shaahZmanis = getShaahZmanisGra();
625 if (shaahZmanis == Long.MIN_VALUE) {
626 return null;
627 }
628 return getTimeOffset(getSeaLevelSunrise(), (long) (shaahZmanis * -1.6));
629 }
630
631 /**
632 * Method to return <em>alos</em> (dawn) calculated using 90 minutes before
633 * {@link #getSeaLevelSunrise() sea level sunrise} on the time to walk the
634 * distance of 4 <em>Mil</em> at 22.5 minutes a <em>Mil</em>. This is based
635 * on the opinion of most <em>Rishonim</em> who stated that the time of the
636 * <em>Neshef</em> (time between dawn and sunrise) does not vary by the time
637 * of year or location but purely depends on the time it takes to walk the
638 * distance of 4 <em>Mil</em>.
639 *
640 * @return the <code>Date</code> representing the time.
641 */
642 public Date getAlos90() {
643 return getTimeOffset(getSeaLevelSunrise(), -90 * MINUTE_MILLIS);
644 }
645
646 /**
647 * Method to return <em>alos</em> (dawn) calculated using 120 minutes before
648 * {@link #getSeaLevelSunrise() sea level sunrise} (no adjustment for
649 * elevation is made) based on the time to walk the distance of 5
650 * <em>Mil</em>( <em>Ula</em>) at 24 minutes a <em>Mil</em>. This is based
651 * on the opinion of most <em>Rishonim</em> who stated that the time of the
652 * <em>Neshef</em> (time between dawn and sunrise) does not vary by the time
653 * of year or location but purely depends on the time it takes to walk the
654 * distance of 5 <em>Mil</em>(<em>Ula</em>).
655 *
656 * @return the <code>Date</code> representing the time.
657 */
658 public Date getAlos120() {
659 return getTimeOffset(getSeaLevelSunrise(), -120 * MINUTE_MILLIS);
660 }
661
662 /**
663 * Method to return <em>alos</em> (dawn) calculated using 120 minutes
664 * <em>zmaniyos</em>( <em>GR"A</em> and the <em>Baal Hatanya</em>) or 1/6th
665 * of the day before sea level sunrise. This is based on a 24 minute
666 * <em>Mil</em> so the time for 5 <em>Mil</em> is 120 minutes which is 1/6th
667 * of a day (12 * 60 = 720) / 6 =120 based on the day starting at
668 * {@link #getSunrise() sunrise} and ending at {@link #getSunset() sunset}.
669 * The actual calculation is {@link #getSunrise()} - (
670 * {@link #getShaahZmanisGra()} * 2).
671 *
672 * @return the <code>Date</code> representing the time.
673 * @see #getShaahZmanisGra()
674 */
675 public Date getAlos120Zmanis() {
676 long shaahZmanis = getShaahZmanisGra();
677 if (shaahZmanis == Long.MIN_VALUE) {
678 return null;
679 }
680 return getTimeOffset(getSeaLevelSunrise(), shaahZmanis * -2);
681 }
682
683 /**
684 * Method to return <em>alos</em> (dawn) calculated when the sun is
685 * {@link #ZENITH_26_DEGREES 26°} below the eastern geometric horizon
686 * before sunrise. This calculation is based on the same calculation of
687 * {@link #getAlos120() 120 minutes} but uses a degree based calculation
688 * instead of 120 exact minutes. This calculation is based on the position
689 * of the sun 120 minutes before sunrise in Jerusalem in the equinox which
690 * calculates to 26° below {@link #GEOMETRIC_ZENITH geometric zenith}.
691 *
692 * @return the <code>Date</code> representing <em>alos</em>.
693 * @see #ZENITH_26_DEGREES
694 * @see #getAlos120()
695 * @see #getTzais120()
696 */
697 public Date getAlos26Degrees() {
698 return getSunriseOffsetByDegrees(ZENITH_26_DEGREES);
699 }
700
701 /**
702 * to return <em>alos</em> (dawn) calculated when the sun is
703 * {@link #ASTRONOMICAL_ZENITH 18°} below the eastern geometric horizon
704 * before sunrise.
705 *
706 * @return the <code>Date</code> representing <em>alos</em>.
707 * @see #ASTRONOMICAL_ZENITH
708 */
709 public Date getAlos18Degrees() {
710 return getSunriseOffsetByDegrees(ASTRONOMICAL_ZENITH);
711 }
712
713 /**
714 * Method to return <em>alos</em> (dawn) calculated when the sun is
715 * {@link #ZENITH_19_POINT_8 19.8°} below the eastern geometric horizon
716 * before sunrise. This calculation is based on the same calculation of
717 * {@link #getAlos90() 90 minutes} but uses a degree based calculation
718 * instead of 90 exact minutes. This calculation is based on the position of
719 * the sun 90 minutes before sunrise in Jerusalem in the equinox which
720 * calculates to 19.8° below {@link #GEOMETRIC_ZENITH geometric zenith}
721 *
722 * @return the <code>Date</code> representing <em>alos</em>.
723 * @see #ZENITH_19_POINT_8
724 * @see #getAlos90()
725 */
726 public Date getAlos19Point8Degrees() {
727 return getSunriseOffsetByDegrees(ZENITH_19_POINT_8);
728 }
729
730 /**
731 * Method to return <em>alos</em> (dawn) calculated when the sun is
732 * {@link #ZENITH_16_POINT_1 16.1°} below the eastern geometric horizon
733 * before sunrise. This calculation is based on the same calculation of
734 * {@link #getAlos72() 72 minutes} but uses a degree based calculation
735 * instead of 72 exact minutes. This calculation is based on the position of
736 * the sun 72 minutes before sunrise in Jerusalem in the equinox which
737 * calculates to 16.1° below {@link #GEOMETRIC_ZENITH geometric zenith}.
738 *
739 * @return the <code>Date</code> representing <em>alos</em>.
740 * @see #ZENITH_16_POINT_1
741 * @see #getAlos72()
742 */
743 public Date getAlos16Point1Degrees() {
744 return getSunriseOffsetByDegrees(ZENITH_16_POINT_1);
745 }
746
747 /**
748 * This method returns <em>misheyakir</em> based on the position of the sun
749 * when it is {@link #ZENITH_11_DEGREES 11.5°} below
750 * {@link #GEOMETRIC_ZENITH geometric zenith} (90°). This calculation is
751 * used for calculating <em>misheyakir</em> according to some opinions. This
752 * calculation is based on the position of the sun 52 minutes before
753 * {@link #getSunrise sunrise}in Jerusalem in the equinox which calculates
754 * to 11.5° below {@link #GEOMETRIC_ZENITH geometric zenith}
755 *
756 * @see #ZENITH_11_POINT_5
757 */
758 public Date getMisheyakir11Point5Degrees() {
759 return getSunriseOffsetByDegrees(ZENITH_11_POINT_5);
760 }
761
762 /**
763 * This method returns <em>misheyakir</em> based on the position of the sun
764 * when it is {@link #ZENITH_11_DEGREES 11°} below
765 * {@link #GEOMETRIC_ZENITH geometric zenith} (90°). This calculation is
766 * used for calculating <em>misheyakir</em> according to some opinions. This
767 * calculation is based on the position of the sun 48 minutes before
768 * {@link #getSunrise sunrise}in Jerusalem in the equinox which calculates
769 * to 11° below {@link #GEOMETRIC_ZENITH geometric zenith}
770 *
771 * @see #ZENITH_11_DEGREES
772 */
773 public Date getMisheyakir11Degrees() {
774 return getSunriseOffsetByDegrees(ZENITH_11_DEGREES);
775 }
776
777 /**
778 * This method returns <em>misheyakir</em> based on the position of the sun
779 * when it is {@link #ZENITH_10_POINT_2 10.2°} below
780 * {@link #GEOMETRIC_ZENITH geometric zenith} (90°). This calculation is
781 * used for calculating <em>misheyakir</em> according to some opinions. This
782 * calculation is based on the position of the sun 45 minutes before
783 * {@link #getSunrise sunrise} in Jerusalem in the equinox which calculates
784 * to 10.2° below {@link #GEOMETRIC_ZENITH geometric zenith}
785 *
786 * @see #ZENITH_10_POINT_2
787 */
788 public Date getMisheyakir10Point2Degrees() {
789 return getSunriseOffsetByDegrees(ZENITH_10_POINT_2);
790 }
791
792 /**
793 * This method returns the latest <em>zman krias shema</em> (time to say
794 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
795 * <em>alos</em> being {@link #getAlos19Point8Degrees()() 19.8°} before
796 * {@link #getSunrise() sunrise}. This time is 3
797 * <em>{@link #getShaahZmanis19Point8Degrees() shaos zmaniyos}</em> (solar
798 * hours) after {@link #getAlos19Point8Degrees() dawn} based on the opinion
799 * of the <em>MG"A</em> that the day is calculated from dawn to nightfall
800 * with both being 19.8° below sunrise or sunset. This returns the time
801 * of 3 {@link #getShaahZmanis19Point8Degrees()} after
802 * {@link #getAlos19Point8Degrees() dawn}.
803 *
804 * @return the <code>Date</code> of the latest zman shema.
805 * @see #getShaahZmanis19Point8Degrees()
806 * @see #getAlos19Point8Degrees()
807 */
808 public Date getSofZmanShmaMGA19Point8Degrees() {
809 return getTimeOffset(getAlos19Point8Degrees(),
810 getShaahZmanis19Point8Degrees() * 3);
811 }
812
813 /**
814 * This method returns the latest <em>zman krias shema</em> (time to say
815 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
816 * <em>alos</em> being {@link #getAlos16Point1Degrees()() 16.1°} before
817 * {@link #getSunrise() sunrise}. This time is 3
818 * <em>{@link #getShaahZmanis16Point1Degrees() shaos zmaniyos}</em> (solar
819 * hours) after {@link #getAlos16Point1Degrees() dawn} based on the opinion
820 * of the <em>MG"A</em> that the day is calculated from dawn to nightfall
821 * with both being 16.1° below sunrise or sunset. This returns the time
822 * of 3 {@link #getShaahZmanis16Point1Degrees()} after
823 * {@link #getAlos16Point1Degrees() dawn}.
824 *
825 * @return the <code>Date</code> of the latest zman shema.
826 * @see #getShaahZmanis16Point1Degrees()
827 * @see #getAlos16Point1Degrees()
828 */
829 public Date getSofZmanShmaMGA16Point1Degrees() {
830 return getTimeOffset(getAlos16Point1Degrees(),
831 getShaahZmanis16Point1Degrees() * 3);
832 }
833
834 /**
835 * This method returns the latest <em>zman krias shema</em> (time to say
836 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
837 * <em>alos</em> being {@link #getAlos72() 72} minutes before
838 * {@link #getSunrise() sunrise}. This time is 3
839 * <em>{@link #getShaahZmanis72Minutes() shaos zmaniyos}</em> (solar hours)
840 * after {@link #getAlos72() dawn} based on the opinion of the <em>MG"A</em>
841 * that the day is calculated from a {@link #getAlos72() dawn} of 72 minutes
842 * before sunrise to {@link #getTzais72() nightfall} of 72 minutes after
843 * sunset. This returns the time of 3 * {@link #getShaahZmanis72Minutes()}
844 * after {@link #getAlos72() dawn}. This class returns an identical time to
845 * {@link #getSofZmanShmaMGA()} and is repeated here for clarity.
846 *
847 * @return the <code>Date</code> of the latest zman shema.
848 * @see #getShaahZmanis72Minutes()
849 * @see #getAlos72()
850 * @see #getSofZmanShmaMGA()
851 */
852 public Date getSofZmanShmaMGA72Minutes() {
853 return getSofZmanShmaMGA();
854 }
855
856 /**
857 * This method returns the latest <em>zman krias shema</em> (time to say
858 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
859 * <em>alos</em> being {@link #getAlos72Zmanis() 72} minutes
860 * <em>zmaniyos</em>, or 1/10th of the day before {@link #getSunrise()
861 * sunrise}. This time is 3
862 * <em>{@link #getShaahZmanis90MinutesZmanis() shaos zmaniyos}</em> (solar
863 * hours) after {@link #getAlos72Zmanis() dawn} based on the opinion of the
864 * <em>MG"A</em> that the day is calculated from a
865 * {@link #getAlos72Zmanis() dawn} of 72 minutes <em>zmaniyos</em>, or
866 * 1/10th of the day before {@link #getSeaLevelSunrise() sea level sunrise}
867 * to {@link #getTzais72Zmanis() nightfall} of 72 minutes <em>zmaniyos</em>
868 * after {@link #getSeaLevelSunset() sea level sunset}. This returns the
869 * time of 3 * {@link #getShaahZmanis72MinutesZmanis()} after
870 * {@link #getAlos72Zmanis() dawn}.
871 *
872 * @return the <code>Date</code> of the latest zman shema.
873 * @see #getShaahZmanis72MinutesZmanis()
874 * @see #getAlos72Zmanis()
875 */
876 public Date getSofZmanShmaMGA72MinutesZmanis() {
877 return getTimeOffset(getAlos72Zmanis(),
878 getShaahZmanis72MinutesZmanis() * 3);
879 }
880
881 /**
882 * This method returns the latest <em>zman krias shema</em> (time to say
883 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
884 * <em>alos</em> being {@link #getAlos90() 90} minutes before
885 * {@link #getSunrise() sunrise}. This time is 3
886 * <em>{@link #getShaahZmanis90Minutes() shaos zmaniyos}</em> (solar hours)
887 * after {@link #getAlos90() dawn} based on the opinion of the <em>MG"A</em>
888 * that the day is calculated from a {@link #getAlos90() dawn} of 90 minutes
889 * before sunrise to {@link #getTzais90() nightfall} of 90 minutes after
890 * sunset. This returns the time of 3 * {@link #getShaahZmanis90Minutes()}
891 * after {@link #getAlos90() dawn}.
892 *
893 * @return the <code>Date</code> of the latest zman shema.
894 * @see #getShaahZmanis90Minutes()
895 * @see #getAlos90()
896 */
897 public Date getSofZmanShmaMGA90Minutes() {
898 return getTimeOffset(getAlos90(), getShaahZmanis90Minutes() * 3);
899 }
900
901 /**
902 * This method returns the latest <em>zman krias shema</em> (time to say
903 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
904 * <em>alos</em> being {@link #getAlos90Zmanis() 90} minutes
905 * <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This time is 3
906 * <em>{@link #getShaahZmanis90MinutesZmanis() shaos zmaniyos}</em> (solar
907 * hours) after {@link #getAlos90Zmanis() dawn} based on the opinion of the
908 * <em>MG"A</em> that the day is calculated from a
909 * {@link #getAlos90Zmanis() dawn} of 90 minutes <em>zmaniyos</em> before
910 * sunrise to {@link #getTzais90Zmanis() nightfall} of 90 minutes
911 * <em>zmaniyos</em> after sunset. This returns the time of 3 *
912 * {@link #getShaahZmanis90MinutesZmanis()} after {@link #getAlos90Zmanis()
913 * dawn}.
914 *
915 * @return the <code>Date</code> of the latest zman shema.
916 * @see #getShaahZmanis90MinutesZmanis()
917 * @see #getAlos90Zmanis()
918 */
919 public Date getSofZmanShmaMGA90MinutesZmanis() {
920 return getTimeOffset(getAlos90Zmanis(),
921 getShaahZmanis90MinutesZmanis() * 3);
922 }
923
924 /**
925 * This method returns the latest <em>zman krias shema</em> (time to say
926 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
927 * <em>alos</em> being {@link #getAlos96() 96} minutes before
928 * {@link #getSunrise() sunrise}. This time is 3
929 * <em>{@link #getShaahZmanis96Minutes() shaos zmaniyos}</em> (solar hours)
930 * after {@link #getAlos96() dawn} based on the opinion of the <em>MG"A</em>
931 * that the day is calculated from a {@link #getAlos96() dawn} of 96 minutes
932 * before sunrise to {@link #getTzais96() nightfall} of 96 minutes after
933 * sunset. This returns the time of 3 * {@link #getShaahZmanis96Minutes()}
934 * after {@link #getAlos96() dawn}.
935 *
936 * @return the <code>Date</code> of the latest zman shema.
937 * @see #getShaahZmanis96Minutes()
938 * @see #getAlos96()
939 */
940 public Date getSofZmanShmaMGA96Minutes() {
941 return getTimeOffset(getAlos96(), getShaahZmanis96Minutes() * 3);
942 }
943
944 /**
945 * This method returns the latest <em>zman krias shema</em> (time to say
946 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
947 * <em>alos</em> being {@link #getAlos90Zmanis() 96} minutes
948 * <em>zmaniyos</em> before {@link #getSunrise() sunrise}. This time is 3
949 * <em>{@link #getShaahZmanis96MinutesZmanis() shaos zmaniyos}</em> (solar
950 * hours) after {@link #getAlos96Zmanis() dawn} based on the opinion of the
951 * <em>MG"A</em> that the day is calculated from a
952 * {@link #getAlos96Zmanis() dawn} of 96 minutes <em>zmaniyos</em> before
953 * sunrise to {@link #getTzais90Zmanis() nightfall} of 96 minutes
954 * <em>zmaniyos</em> after sunset. This returns the time of 3 *
955 * {@link #getShaahZmanis96MinutesZmanis()} after {@link #getAlos96Zmanis()
956 * dawn}.
957 *
958 * @return the <code>Date</code> of the latest zman shema.
959 * @see #getShaahZmanis96MinutesZmanis()
960 * @see #getAlos96Zmanis()
961 */
962 public Date getSofZmanShmaMGA96MinutesZmanis() {
963 return getTimeOffset(getAlos96Zmanis(),
964 getShaahZmanis96MinutesZmanis() * 3);
965 }
966
967 /**
968 * This method returns the latest <em>zman krias shema</em> (time to say
969 * Shema in the morning) calculated as 3 hours (regular and not zmaniyos)
970 * before {@link ZmanimCalendar#getChatzos()}. This is the opinion of the
971 * <em>Shach</em> in the
972 * <em>Nekudas Hakesef (Yora Deah 184), Shevus Yaakov, Chasan Sofer</em> and
973 * others.This returns the time of 3 hours before
974 * {@link ZmanimCalendar#getChatzos()}.
975 *
976 * @return the <code>Date</code> of the latest zman shema.
977 * @see ZmanimCalendar#getChatzos()
978 * @see #getSofZmanTfila2HoursBeforeChatzos()
979 */
980 public Date getSofZmanShma3HoursBeforeChatzos() {
981 return getTimeOffset(getChatzos(), -180 * MINUTE_MILLIS);
982 }
983
984 /**
985 * This method returns the latest <em>zman krias shema</em> (time to say
986 * Shema in the morning) in the opinion of the <em>MG"A</em> based on
987 * <em>alos</em> being {@link #getAlos120() 120} minutes or 1/6th of the day
988 * before {@link #getSunrise() sunrise}. This time is 3
989 * <em>{@link #getShaahZmanis120Minutes() shaos zmaniyos}</em> (solar hours)
990 * after {@link #getAlos120() dawn} based on the opinion of the
991 * <em>MG"A</em> that the day is calculated from a {@link #getAlos120()
992 * dawn} of 120 minutes before sunrise to {@link #getTzais120() nightfall}
993 * of 120 minutes after sunset. This returns the time of 3 *
994 * {@link #getShaahZmanis120Minutes()} after {@link #getAlos120() dawn}.
995 *
996 * @return the <code>Date</code> of the latest zman shema.
997 * @see #getShaahZmanis120Minutes()
998 * @see #getAlos120()
999 */
1000 public Date getSofZmanShmaMGA120Minutes() {
1001 return getTimeOffset(getAlos120(), getShaahZmanis120Minutes() * 3);
1002 }
1003
1004 /**
1005 * This method returns the latest <em>zman krias shema</em> (time to say
1006 * Shema in the morning) based on the opinion that the day starts at
1007 * <em>{@link #getAlos16Point1Degrees() alos 16.1°}</em> and ends at
1008 * {@link #getSeaLevelSunset() sea level sunset}. 3 shaos zmaniyos are
1009 * calculated based on this day and added to
1010 * {@link #getAlos16Point1Degrees() alos}to reach this time. This time is 3
1011 * <em>shaos zmaniyos</em> (solar hours) after
1012 * {@link #getAlos16Point1Degrees() dawn} based on the opinion that the day
1013 * is calculated from a {@link #getAlos16Point1Degrees() alos 16.1°} to
1014 * {@link #getSeaLevelSunset() sea level sunset}.<br />
1015 * <b>Note: </b> Based on this calculation <em>chatzos</em> will not be at
1016 * midday.
1017 *
1018 * @return the <code>Date</code> of the latest zman shema based on this day.
1019 * @see #getAlos16Point1Degrees()
1020 * @see #getSeaLevelSunset()
1021 */
1022 public Date getSofZmanShmaAlos16Point1ToSunset() {
1023 long shaahZmanis = getTemporalHour(getAlos16Point1Degrees(),
1024 getSeaLevelSunset());
1025 return getTimeOffset(getAlos16Point1Degrees(), shaahZmanis * 3);
1026 }
1027
1028 /**
1029 * This method returns the latest <em>zman krias shema</em> (time to say
1030 * Shema in the morning) based on the opinion that the day starts at
1031 * <em>{@link #getAlos16Point1Degrees() alos 16.1°}</em> and ends at
1032 * {@link #getTzaisGeonim7Point083Degrees() tzais 7.083°}. 3
1033 * <em>shaos zmaniyos</em> are calculated based on this day and added to
1034 * {@link #getAlos16Point1Degrees() alos} to reach this time. This time is 3
1035 * <em>shaos zmaniyos</em> (temporal hours) after
1036 * {@link #getAlos16Point1Degrees() alos 16.1°} based on the opinion
1037 * that the day is calculated from a {@link #getAlos16Point1Degrees() alos
1038 * 16.1°} to
1039 * <em>{@link #getTzaisGeonim7Point083Degrees() tzais 7.083°}</em>.<br />
1040 * <b>Note: </b> Based on this calculation <em>chatzos</em> will not be at
1041 * midday.
1042 *
1043 * @return the <code>Date</code> of the latest zman shema based on this
1044 * calculation.
1045 * @see #getAlos16Point1Degrees()
1046 * @see #getTzaisGeonim7Point083Degrees()
1047 */
1048 public Date getSofZmanShmaAlos16Point1ToTzaisGeonim7Point083Degrees() {
1049 long shaahZmanis = getTemporalHour(getAlos16Point1Degrees(),
1050 getTzaisGeonim7Point083Degrees());
1051 return getTimeOffset(getAlos16Point1Degrees(), shaahZmanis * 3);
1052 }
1053
1054 /**
1055 * From the GR"A in Kol Eliyahu on Berachos #173 that states that zman krias
1056 * shema is calculated as half the time from {@link #getSeaLevelSunrise()
1057 * sea level sunset} to fixed local chatzos. The GR"A himself seems to
1058 * contradic this when he stated that zman krias shema is 1/4 of the day
1059 * from sunrise to sunset. See Sarah Lamoed #25 in Yisroel Vehazmanim Vol
1060 * III page 1016.
1061 *
1062 * @return the <code>Date</code> of the latest zman shema based on this
1063 * calculation.
1064 * @see #getFixedLocalChatzos()
1065 */
1066 public Date getSofZmanShmaKolEliyahu() {
1067 Date chatzos = getFixedLocalChatzos();
1068 if (chatzos == null || getSunrise() == null) {
1069 return null;
1070 }
1071 long diff = (chatzos.getTime() - getSeaLevelSunrise().getTime()) / 2;
1072 return getTimeOffset(chatzos, -diff);
1073 }
1074
1075 /**
1076 * This method returns the latest <em>zman tfila</em> (time to say the
1077 * morning prayers) in the opinion of the <em>MG"A</em> based on
1078 * <em>alos</em> being {@link #getAlos19Point8Degrees()() 19.8°} before
1079 * {@link #getSunrise() sunrise}. This time is 4
1080 * <em>{@link #getShaahZmanis19Point8Degrees() shaos zmaniyos}</em> (solar
1081 * hours) after {@link #getAlos19Point8Degrees() dawn} based on the opinion
1082 * of the <em>MG"A</em> that the day is calculated from dawn to nightfall
1083 * with both being 19.8° below sunrise or sunset. This returns the time
1084 * of 4 {@link #getShaahZmanis19Point8Degrees()} after
1085 * {@link #getAlos19Point8Degrees() dawn}.
1086 *
1087 * @return the <code>Date</code> of the latest zman shema.
1088 *
1089 * @see #getShaahZmanis19Point8Degrees()
1090 * @see #getAlos19Point8Degrees()
1091 */
1092 public Date getSofZmanTfilaMGA19Point8Degrees() {
1093 return getTimeOffset(getAlos19Point8Degrees(),
1094 getShaahZmanis19Point8Degrees() * 4);
1095 }
1096
1097 /**
1098 * This method returns the latest <em>zman tfila</em> (time to say the
1099 * morning prayers) in the opinion of the <em>MG"A</em> based on
1100 * <em>alos</em> being {@link #getAlos19Point8Degrees()() 16.1°} before
1101 * {@link #getSunrise() sunrise}. This time is 4
1102 * <em>{@link #getShaahZmanis16Point1Degrees() shaos zmaniyos}</em> (solar
1103 * hours) after {@link #getAlos16Point1Degrees() dawn} based on the opinion
1104 * of the <em>MG"A</em> that the day is calculated from dawn to nightfall
1105 * with both being 16.1° below sunrise or sunset. This returns the time
1106 * of 4 {@link #getShaahZmanis16Point1Degrees()} after
1107 * {@link #getAlos16Point1Degrees() dawn}.
1108 *
1109 * @return the <code>Date</code> of the latest zman shema.
1110 *
1111 * @see #getShaahZmanis16Point1Degrees()
1112 * @see #getAlos16Point1Degrees()
1113 */
1114 public Date getSofZmanTfilaMGA16Point1Degrees() {
1115 return getTimeOffset(getAlos16Point1Degrees(),
1116 getShaahZmanis16Point1Degrees() * 4);
1117 }
1118
1119 /**
1120 * This method returns the latest <em>zman tfila</em> (time to say the
1121 * morning prayers) in the opinion of the <em>MG"A</em> based on
1122 * <em>alos</em> being {@link #getAlos72() 72} minutes before
1123 * {@link #getSunrise() sunrise}. This time is 4
1124 * <em>{@link #getShaahZmanis72Minutes() shaos zmaniyos}</em> (solar hours)
1125 * after {@link #getAlos72() dawn} based on the opinion of the <em>MG"A</em>
1126 * that the day is calculated from a {@link #getAlos72() dawn} of 72 minutes
1127 * before sunrise to {@link #getTzais72() nightfall} of 72 minutes after
1128 * sunset. This returns the time of 4 * {@link #getShaahZmanis72Minutes()}
1129 * after {@link #getAlos72() dawn}. This class returns an identical time to
1130 * {@link #getSofZmanTfilaMGA()} and is repeated here for clarity.
1131 *
1132 * @return the <code>Date</code> of the latest zman tfila.
1133 * @see #getShaahZmanis72Minutes()
1134 * @see #getAlos72()
1135 * @see #getSofZmanShmaMGA()
1136 */
1137 public Date getSofZmanTfilaMGA72Minutes() {
1138 return getSofZmanTfilaMGA();
1139 }
1140
1141 /**
1142 * This method returns the latest <em>zman tfila</em> (time to the morning
1143 * prayers) in the opinion of the <em>MG"A</em> based on <em>alos</em> being
1144 * {@link #getAlos72Zmanis() 72} minutes <em>zmaniyos</em> before
1145 * {@link #getSunrise() sunrise}. This time is 4
1146 * <em>{@link #getShaahZmanis72MinutesZmanis() shaos zmaniyos}</em> (solar
1147 * hours) after {@link #getAlos72Zmanis() dawn} based on the opinion of the
1148 * <em>MG"A</em> that the day is calculated from a
1149 * {@link #getAlos72Zmanis() dawn} of 72 minutes <em>zmaniyos</em> before
1150 * sunrise to {@link #getTzais72Zmanis() nightfall} of 72 minutes
1151 * <em>zmaniyos</em> after sunset. This returns the time of 4 *
1152 * {@link #getShaahZmanis72MinutesZmanis()} after {@link #getAlos72Zmanis()
1153 * dawn}.
1154 *
1155 * @return the <code>Date</code> of the latest zman shema.
1156 * @see #getShaahZmanis72MinutesZmanis()
1157 * @see #getAlos72Zmanis()
1158 */
1159 public Date getSofZmanTfilaMGA72MinutesZmanis() {
1160 return getTimeOffset(getAlos72Zmanis(),
1161 getShaahZmanis72MinutesZmanis() * 4);
1162 }
1163
1164 /**
1165 * This method returns the latest <em>zman tfila</em> (time to say the
1166 * morning prayers) in the opinion of the <em>MG"A</em> based on
1167 * <em>alos</em> being {@link #getAlos90() 90} minutes before
1168 * {@link #getSunrise() sunrise}. This time is 4
1169 * <em>{@link #getShaahZmanis90Minutes() shaos zmaniyos}</em> (solar hours)
1170 * after {@link #getAlos90() dawn} based on the opinion of the <em>MG"A</em>
1171 * that the day is calculated from a {@link #getAlos90() dawn} of 90 minutes
1172 * before sunrise to {@link #getTzais90() nightfall} of 90 minutes after
1173 * sunset. This returns the time of 4 * {@link #getShaahZmanis90Minutes()}
1174 * after {@link #getAlos90() dawn}.
1175 *
1176 * @return the <code>Date</code> of the latest zman tfila.
1177 * @see #getShaahZmanis90Minutes()
1178 * @see #getAlos90()
1179 */
1180 public Date getSofZmanTfilaMGA90Minutes() {
1181 return getTimeOffset(getAlos90(), getShaahZmanis90Minutes() * 4);
1182 }
1183
1184 /**
1185 * This method returns the latest <em>zman tfila</em> (time to the morning
1186 * prayers) in the opinion of the <em>MG"A</em> based on <em>alos</em> being
1187 * {@link #getAlos90Zmanis() 90} minutes <em>zmaniyos</em> before
1188 * {@link #getSunrise() sunrise}. This time is 4
1189 * <em>{@link #getShaahZmanis90MinutesZmanis() shaos zmaniyos}</em> (solar
1190 * hours) after {@link #getAlos90Zmanis() dawn} based on the opinion of the
1191 * <em>MG"A</em> that the day is calculated from a
1192 * {@link #getAlos90Zmanis() dawn} of 90 minutes <em>zmaniyos</em> before
1193 * sunrise to {@link #getTzais90Zmanis() nightfall} of 90 minutes
1194 * <em>zmaniyos</em> after sunset. This returns the time of 4 *
1195 * {@link #getShaahZmanis90MinutesZmanis()} after {@link #getAlos90Zmanis()
1196 * dawn}.
1197 *
1198 * @return the <code>Date</code> of the latest zman shema.
1199 * @see #getShaahZmanis90MinutesZmanis()
1200 * @see #getAlos90Zmanis()
1201 */
1202 public Date getSofZmanTfilaMGA90MinutesZmanis() {
1203 return getTimeOffset(getAlos90Zmanis(),
1204 getShaahZmanis90MinutesZmanis() * 4);
1205 }
1206
1207 /**
1208 * This method returns the latest <em>zman tfila</em> (time to say the
1209 * morning prayers) in the opinion of the <em>MG"A</em> based on
1210 * <em>alos</em> being {@link #getAlos96() 96} minutes before
1211 * {@link #getSunrise() sunrise}. This time is 4
1212 * <em>{@link #getShaahZmanis96Minutes() shaos zmaniyos}</em> (solar hours)
1213 * after {@link #getAlos96() dawn} based on the opinion of the <em>MG"A</em>
1214 * that the day is calculated from a {@link #getAlos96() dawn} of 96 minutes
1215 * before sunrise to {@link #getTzais96() nightfall} of 96 minutes after
1216 * sunset. This returns the time of 4 * {@link #getShaahZmanis96Minutes()}
1217 * after {@link #getAlos96() dawn}.
1218 *
1219 * @return the <code>Date</code> of the latest zman tfila.
1220 * @see #getShaahZmanis96Minutes()
1221 * @see #getAlos96()
1222 */
1223 public Date getSofZmanTfilaMGA96Minutes() {
1224 return getTimeOffset(getAlos96(), getShaahZmanis96Minutes() * 4);
1225 }
1226
1227 /**
1228 * This method returns the latest <em>zman tfila</em> (time to the morning
1229 * prayers) in the opinion of the <em>MG"A</em> based on <em>alos</em> being
1230 * {@link #getAlos96Zmanis() 96} minutes <em>zmaniyos</em> before
1231 * {@link #getSunrise() sunrise}. This time is 4
1232 * <em>{@link #getShaahZmanis96MinutesZmanis() shaos zmaniyos}</em> (solar
1233 * hours) after {@link #getAlos96Zmanis() dawn} based on the opinion of the
1234 * <em>MG"A</em> that the day is calculated from a
1235 * {@link #getAlos96Zmanis() dawn} of 96 minutes <em>zmaniyos</em> before
1236 * sunrise to {@link #getTzais96Zmanis() nightfall} of 96 minutes
1237 * <em>zmaniyos</em> after sunset. This returns the time of 4 *
1238 * {@link #getShaahZmanis96MinutesZmanis()} after {@link #getAlos96Zmanis()
1239 * dawn}.
1240 *
1241 * @return the <code>Date</code> of the latest zman shema.
1242 * @see #getShaahZmanis90MinutesZmanis()
1243 * @see #getAlos90Zmanis()
1244 */
1245 public Date getSofZmanTfilaMGA96MinutesZmanis() {
1246 return getTimeOffset(getAlos96Zmanis(),
1247 getShaahZmanis96MinutesZmanis() * 4);
1248 }
1249
1250 /**
1251 * This method returns the latest <em>zman tfila</em> (time to say the
1252 * morning prayers) in the opinion of the <em>MG"A</em> based on
1253 * <em>alos</em> being {@link #getAlos120() 120} minutes before
1254 * {@link #getSunrise() sunrise}. This time is 4
1255 * <em>{@link #getShaahZmanis120Minutes() shaos zmaniyos}</em> (solar hours)
1256 * after {@link #getAlos120() dawn} based on the opinion of the
1257 * <em>MG"A</em> that the day is calculated from a {@link #getAlos120()
1258 * dawn} of 120 minutes before sunrise to {@link #getTzais120() nightfall}
1259 * of 120 minutes after sunset. This returns the time of 4 *
1260 * {@link #getShaahZmanis120Minutes()} after {@link #getAlos120() dawn}.
1261 *
1262 * @return the <code>Date</code> of the latest zman shema.
1263 * @see #getShaahZmanis120Minutes()
1264 * @see #getAlos120()
1265 */
1266 public Date getSofZmanTfilaMGA120Minutes() {
1267 return getTimeOffset(getAlos120(), getShaahZmanis120Minutes() * 4);
1268 }
1269
1270 /**
1271 * This method returns the latest <em>zman tfila</em> (time to say the
1272 * morning prayers) calculated as 2 hours befor
1273 * {@link ZmanimCalendar#getChatzos()}. This is based on the opinions that
1274 * calculate <em>sof zman krias shema</em> as
1275 * {@link #getSofZmanShma3HoursBeforeChatzos()}. This returns the time of 2
1276 * hours before {@link ZmanimCalendar#getChatzos()}.
1277 *
1278 * @return the <code>Date</code> of the latest zman shema.
1279 * @see ZmanimCalendar#getChatzos()
1280 * @see #getSofZmanShma3HoursBeforeChatzos()
1281 */
1282 public Date getSofZmanTfila2HoursBeforeChatzos() {
1283 return getTimeOffset(getChatzos(), -120 * MINUTE_MILLIS);
1284 }
1285
1286 /**
1287 * This method returns mincha gedola calculated as 30 minutes after
1288 * <em>{@link #getChatzos() chatzos}</em> and not 1/2 of a
1289 * <em>{@link #getShaahZmanisGra() shaah zmanis}</em> after
1290 * <em>{@link #getChatzos() chatzos}</em> as calculated by
1291 * {@link #getMinchaGedola}. Some use this time to delay the start of mincha
1292 * in the winter when 1/2 of a
1293 * <em>{@link #getShaahZmanisGra() shaah zmanis}</em> is less than 30
1294 * minutes. See {@link #getMinchaGedolaGreaterThan30()}for a conveniance
1295 * method that returns the later of the 2 calculations. One should not use
1296 * this time to start <em>mincha</em> before the standard
1297 * <em>{@link #getMinchaGedola() mincha gedola}</em>. See <em>Shulchan Aruch
1298 * Orach Chayim Siman Raish Lamed Gimel seif alef</em> and the
1299 * <em>Shaar Hatziyon seif katan ches</em>.
1300 *
1301 * @return the <code>Date</code> of 30 mintes after <em>chatzos</em>.
1302 * @see #getMinchaGedola()
1303 * @see #getMinchaGedolaGreaterThan30()
1304 */
1305 public Date getMinchaGedola30Minutes() {
1306 return getTimeOffset(getChatzos(), MINUTE_MILLIS * 30);
1307 }
1308
1309 /**
1310 * This method returns the time of <em>mincha gedola</em> according to the
1311 * Magen Avraham with the day starting 72 minutes before sunrise and ending
1312 * 72 minutes after sunset. This is the earliest time to pray
1313 * <em>mincha</em>. For more information on this see the documentation on
1314 * <em>{@link #getMinchaGedola() mincha gedola}</em>. This is calculated as
1315 * 6.5 {@link #getTemporalHour() solar hours} after alos. The calculation
1316 * used is 6.5 * {@link #getShaahZmanis72Minutes()} after
1317 * {@link #getAlos72() alos}.
1318 *
1319 * @see #getAlos72()()
1320 * @see #getMinchaGedola()
1321 * @see #getMinchaKetana()
1322 * @see ZmanimCalendar#getMinchaGedola()
1323 * @return the <code>Date</code> of the time of mincha gedola.
1324 */
1325 public Date getMinchaGedola72Minutes() {
1326 return getTimeOffset(getAlos72(), getShaahZmanis72Minutes() * 6.5);
1327 }
1328
1329 /**
1330 * This method returns the time of <em>mincha gedola</em> according to the
1331 * Magen Avraham with the day starting and ending 16.1° below the
1332 * horizon. This is the earliest time to pray <em>mincha</em>. For more
1333 * information on this see the documentation on
1334 * <em>{@link #getMinchaGedola() mincha gedola}</em>. This is calculated as
1335 * 6.5 {@link #getTemporalHour() solar hours} after alos. The calculation
1336 * used is 6.5 * {@link #getShaahZmanis16Point1Degrees()} after
1337 * {@link #getAlos16Point1Degrees() alos}.
1338 *
1339 * @see #getShaahZmanis16Point1Degrees()
1340 * @see #getMinchaGedola()
1341 * @see #getMinchaKetana()
1342 * @return the <code>Date</code> of the time of mincha gedola.
1343 */
1344 public Date getMinchaGedola16Point1Degrees() {
1345 return getTimeOffset(getAlos16Point1Degrees(),
1346 getShaahZmanis16Point1Degrees() * 6.5);
1347 }
1348
1349 /**
1350 * This is a conveniance methd that returns the later of
1351 * {@link #getMinchaGedola()} and {@link #getMinchaGedola30Minutes()}. In the
1352 * winter when a <em>{@link #getShaahZmanisGra() shaah zmanis}</em> is less
1353 * than 30 minutes {@link #getMinchaGedola30Minutes()} will be returned,
1354 * otherwise {@link #getMinchaGedola()} will be returned.
1355 *
1356 * @return the <code>Date</code> of the later of {@link #getMinchaGedola()}
1357 * and {@link #getMinchaGedola30Minutes()}
1358 */
1359 public Date getMinchaGedolaGreaterThan30() {
1360 if (getMinchaGedola30Minutes() == null || getMinchaGedola() == null) {
1361 return null;
1362 } else {
1363 return getMinchaGedola30Minutes().compareTo(getMinchaGedola()) > 0 ? getMinchaGedola30Minutes()
1364 : getMinchaGedola();
1365 }
1366 }
1367
1368 /**
1369 * This method returns the time of <em>mincha ketana</em> according to the
1370 * Magen Avraham with the day starting and ending 16.1° below the
1371 * horizon. This is the perfered earliest time to pray <em>mincha</em> in
1372 * the opinion of the Ramba"m and others. For more information on this see
1373 * the documentation on <em>{@link #getMinchaGedola() mincha gedola}</em>.
1374 * This is calculated as 9.5 {@link #getTemporalHour() solar hours} after
1375 * alos. The calculation used is 9.5 *
1376 * {@link #getShaahZmanis16Point1Degrees()} after
1377 * {@link #getAlos16Point1Degrees() alos}.
1378 *
1379 * @see #getShaahZmanis16Point1Degrees()
1380 * @see #getMinchaGedola()
1381 * @see #getMinchaKetana()
1382 * @return the <code>Date</code> of the time of mincha ketana.
1383 */
1384 public Date getMinchaKetana16Point1Degrees() {
1385 return getTimeOffset(getAlos16Point1Degrees(),
1386 getShaahZmanis16Point1Degrees() * 9.5);
1387 }
1388
1389 /**
1390 * This method returns the time of <em>mincha ketana</em> according to the
1391 * Magen Avraham with the day starting 72 minutes before sunrise and ending
1392 * 72 minutes after sunset. This is the perfered earliest time to pray
1393 * <em>mincha</em> in the opinion of the Ramba"m and others. For more
1394 * information on this see the documentation on
1395 * <em>{@link #getMinchaGedola() mincha gedola}</em>. This is calculated as
1396 * 9.5 {@link #getShaahZmanis72Minutes()} after alos. The calculation used
1397 * is 9.5 * {@link #getShaahZmanis72Minutes()} after {@link #getAlos72()
1398 * alos}.
1399 *
1400 * @see #getShaahZmanis16Point1Degrees()
1401 * @see #getMinchaGedola()
1402 * @see #getMinchaKetana()
1403 * @return the <code>Date</code> of the time of mincha ketana.
1404 */
1405 public Date getMinchaKetana72Minutes() {
1406 return getTimeOffset(getAlos72(), getShaahZmanis72Minutes() * 9.5);
1407 }
1408
1409 /**
1410 * This method returns the time of <em>plag hamincha</em>. This is
1411 * calculated as 10.75 hours after {@link #getAlos72() dawn}. The formula
1412 * used is:<br/>
1413 * 10.75 {@link #getShaahZmanis72Minutes()} after {@link #getAlos72()}.
1414 *
1415 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1416 */
1417 public Date getPlagHamincha60Minutes() {
1418 return getTimeOffset(getAlos60(), getShaahZmanis60Minutes() * 10.75);
1419 }
1420
1421 /**
1422 * This method returns the time of <em>plag hamincha</em>. This is
1423 * calculated as 10.75 hours after {@link #getAlos72() dawn}. The formula
1424 * used is:<br/>
1425 * 10.75 {@link #getShaahZmanis72Minutes()} after {@link #getAlos72()}.
1426 *
1427 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1428 */
1429 public Date getPlagHamincha72Minutes() {
1430 return getTimeOffset(getAlos72(), getShaahZmanis72Minutes() * 10.75);
1431 }
1432
1433 /**
1434 * This method returns the time of <em>plag hamincha</em>. This is
1435 * calculated as 10.75 hours after {@link #getAlos90() dawn}. The formula
1436 * used is:<br/>
1437 * 10.75 {@link #getShaahZmanis90Minutes()} after {@link #getAlos90()}.
1438 *
1439 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1440 */
1441 public Date getPlagHamincha90Minutes() {
1442 return getTimeOffset(getAlos90(), getShaahZmanis90Minutes() * 10.75);
1443 }
1444
1445 /**
1446 * This method returns the time of <em>plag hamincha</em>. This is
1447 * calculated as 10.75 hours after {@link #getAlos96() dawn}. The formula
1448 * used is:<br/>
1449 * 10.75 {@link #getShaahZmanis96Minutes()} after {@link #getAlos96()}.
1450 *
1451 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1452 */
1453 public Date getPlagHamincha96Minutes() {
1454 return getTimeOffset(getAlos96(), getShaahZmanis96Minutes() * 10.75);
1455 }
1456
1457 /**
1458 * This method returns the time of <em>plag hamincha</em>. This is
1459 * calculated as 10.75 hours after {@link #getAlos96Zmanis() dawn}. The
1460 * formula used is:<br/>
1461 * 10.75 * {@link #getShaahZmanis96MinutesZmanis()} after
1462 * {@link #getAlos96Zmanis() dawn}.
1463 *
1464 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1465 */
1466 public Date getPlagHamincha96MinutesZmanis() {
1467 return getTimeOffset(getAlos96Zmanis(),
1468 getShaahZmanis96MinutesZmanis() * 10.75);
1469 }
1470
1471 /**
1472 * This method returns the time of <em>plag hamincha</em>. This is
1473 * calculated as 10.75 hours after {@link #getAlos90Zmanis() dawn}. The
1474 * formula used is:<br/>
1475 * 10.75 * {@link #getShaahZmanis90MinutesZmanis()} after
1476 * {@link #getAlos90Zmanis() dawn}.
1477 *
1478 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1479 */
1480 public Date getPlagHamincha90MinutesZmanis() {
1481 return getTimeOffset(getAlos90Zmanis(),
1482 getShaahZmanis90MinutesZmanis() * 10.75);
1483 }
1484
1485 /**
1486 * This method returns the time of <em>plag hamincha</em>. This is
1487 * calculated as 10.75 hours after {@link #getAlos72Zmanis() dawn}. The
1488 * formula used is:<br/>
1489 * 10.75 * {@link #getShaahZmanis72MinutesZmanis()} after
1490 * {@link #getAlos72Zmanis() dawn}.
1491 *
1492 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1493 */
1494 public Date getPlagHamincha72MinutesZmanis() {
1495 return getTimeOffset(getAlos72Zmanis(),
1496 getShaahZmanis72MinutesZmanis() * 10.75);
1497 }
1498
1499 /**
1500 * This method returns the time of <em>plag hamincha</em> based on the
1501 * opinion that the day starts at
1502 * <em>{@link #getAlos16Point1Degrees() alos 16.1°}</em> and ends at
1503 * <em>{@link #getTzais16Point1Degrees() tzais 16.1°}</em>. This is
1504 * calculated as 10.75 hours <em>zmaniyos</em> after
1505 * {@link #getAlos16Point1Degrees() dawn}. The formula is<br/>
1506 * 10.75 * {@link #getShaahZmanis16Point1Degrees()} after
1507 * {@link #getAlos16Point1Degrees()}.
1508 *
1509 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1510 */
1511 public Date getPlagHamincha16Point1Degrees() {
1512 return getTimeOffset(getAlos16Point1Degrees(),
1513 getShaahZmanis16Point1Degrees() * 10.75);
1514 }
1515
1516 /**
1517 * This method returns the time of <em>plag hamincha</em> based on the
1518 * opinion that the day starts at
1519 * <em>{@link #getAlos19Point8Degrees() alos 19.8°}</em> and ends at
1520 * <em>{@link #getTzais19Point8Degrees() tzais 19.8°}</em>. This is
1521 * calculated as 10.75 hours <em>zmaniyos</em> after
1522 * {@link #getAlos19Point8Degrees() dawn}. The formula is<br/>
1523 * 10.75 * {@link #getShaahZmanis19Point8Degrees()} after
1524 * {@link #getAlos19Point8Degrees()}.
1525 *
1526 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1527 */
1528 public Date getPlagHamincha19Point8Degrees() {
1529 return getTimeOffset(getAlos19Point8Degrees(),
1530 getShaahZmanis19Point8Degrees() * 10.75);
1531 }
1532
1533 /**
1534 * This method returns the time of <em>plag hamincha</em> based on the
1535 * opinion that the day starts at
1536 * <em>{@link #getAlos26Degrees() alos 26°}</em> and ends at
1537 * <em>{@link #getTzais26Degrees() tzais 26°}</em>. This is calculated
1538 * as 10.75 hours <em>zmaniyos</em> after {@link #getAlos26Degrees() dawn}.
1539 * The formula is<br/>
1540 * 10.75 * {@link #getShaahZmanis26Degrees()} after
1541 * {@link #getAlos26Degrees()}.
1542 *
1543 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1544 */
1545 public Date getPlagHamincha26Degrees() {
1546 return getTimeOffset(getAlos26Degrees(),
1547 getShaahZmanis26Degrees() * 10.75);
1548 }
1549
1550 /**
1551 * This method returns the time of <em>plag hamincha</em> based on the
1552 * opinion that the day starts at
1553 * <em>{@link #getAlos18Degrees() alos 18°}</em> and ends at
1554 * <em>{@link #getTzais18Degrees() tzais 18°}</em>. This is calculated
1555 * as 10.75 hours <em>zmaniyos</em> after {@link #getAlos18Degrees() dawn}.
1556 * The formula is<br/>
1557 * 10.75 * {@link #getShaahZmanis18Degrees()} after
1558 * {@link #getAlos18Degrees()}.
1559 *
1560 * @return the <code>Date</code> of the time of <em>plag hamincha</em>.
1561 */
1562 public Date getPlagHamincha18Degrees() {
1563 return getTimeOffset(getAlos18Degrees(),
1564 getShaahZmanis18Degrees() * 10.75);
1565 }
1566
1567 /**
1568 * This method returns the time of <em>plag hamincha</em> based on the
1569 * opinion that the day starts at
1570 * <em>{@link #getAlos16Point1Degrees() alos 16.1°}</em> and ends at
1571 * {@link #getSunset() sunset}. 10.75 shaos zmaniyos are calculated based on
1572 * this day and added to {@link #getAlos16Point1Degrees() alos} to reach
1573 * this time. This time is 10.75 <em>shaos zmaniyos</em> (temporal hours)
1574 * after {@link #getAlos16Point1Degrees() dawn} based on the opinion that
1575 * the day is calculated from a {@link #getAlos16Point1Degrees() dawn} of
1576 * 16.1 degrees before sunrise to {@link #getSeaLevelSunset() sea level
1577 * sunset}. This returns the time of 10.75 * the calculated
1578 * <em>shaah zmanis</em> after {@link #getAlos16Point1Degrees() dawn}.
1579 *
1580 * @return the <code>Date</code> of the plag.
1581 * @see #getAlos16Point1Degrees()
1582 * @see #getSeaLevelSunset()
1583 */
1584 public Date getPlagAlosToSunset() {
1585 long shaahZmanis = getTemporalHour(getAlos16Point1Degrees(),
1586 getSeaLevelSunset());
1587 return getTimeOffset(getAlos16Point1Degrees(), shaahZmanis * 10.75);
1588 }
1589
1590 /**
1591 * This method returns the time of <em>plag hamincha</em> based on the
1592 * opinion that the day starts at
1593 * <em>{@link #getAlos16Point1Degrees() alos 16.1°}</em> and ends at
1594 * {@link #getTzaisGeonim7Point083Degrees() tzais}. 10.75 shaos zmaniyos are
1595 * calculated based on this day and added to
1596 * {@link #getAlos16Point1Degrees() alos} to reach this time. This time is
1597 * 10.75 <em>shaos zmaniyos</em> (temporal hours) after
1598 * {@link #getAlos16Point1Degrees() dawn} based on the opinion that the day
1599 * is calculated from a {@link #getAlos16Point1Degrees() dawn} of 16.1
1600 * degrees before sunrise to {@link #getTzaisGeonim7Point083Degrees() tzais}
1601 * . This returns the time of 10.75 * the calculated <em>shaah zmanis</em>
1602 * after {@link #getAlos16Point1Degrees() dawn}.
1603 *
1604 * @return the <code>Date</code> of the plag.
1605 * @see #getAlos16Point1Degrees()
1606 * @see #getTzaisGeonim7Point083Degrees()
1607 */
1608 public Date getPlagAlos16Point1ToTzaisGeonim7Point083Degrees() {
1609 long shaahZmanis = getTemporalHour(getAlos16Point1Degrees(),
1610 getTzaisGeonim7Point083Degrees());
1611 return getTimeOffset(getAlos16Point1Degrees(), shaahZmanis * 10.75);
1612 }
1613
1614 /**
1615 * This method returns Bain Hashmashos of Rabainu Tam calculated as the time
1616 * the sun is 13° below {@link #GEOMETRIC_ZENITH geometric zenith}
1617 * (90°). <br/>
1618 * <br/>
1619 * <b>FIXME:</b> As per Yisroel Vehazmanim Vol III page 1028 No 50, the
1620 * 13° is slightly inaccurate. He lists it as a drop less than 13°.
1621 * Calculations show that is seems to be 13.2477° below the horizon at
1622 * that time. This makes a difference of 1 minute and 10 seconds in
1623 * Jerusalem in the Equinox, and 1 minute 29 seconds in the solstice. for NY
1624 * in the solstice, the difference is 1 minute 56 seconds.
1625 *
1626 * @return the <code>Date</code> of the sun being 13° below
1627 * {@link #GEOMETRIC_ZENITH geometric zenith} (90°).
1628 * @see #ZENITH_13_DEGREES
1629 *
1630 */
1631 public Date getBainHasmashosRT13Degrees() {
1632 return getSunsetOffsetByDegrees(ZENITH_13_DEGREES);
1633 }
1634
1635 /**
1636 * This method returns Bain Hashmashos of Rabainu Tam calculated as a 58.5
1637 * minute offset after sunset. Bain hashmashos is 3/4 of a mil before tzais
1638 * or 3 1/4 mil after sunset. With a mil calculated as 18 minutes, 3.25 * 18
1639 * = 58.5 minutes.
1640 *
1641 * @return the <code>Date</code> of 58.5 minutes after sunset
1642 *
1643 */
1644 public Date getBainHasmashosRT58Point5Minutes() {
1645 return getTimeOffset(getSeaLevelSunset(), 58.5 * MINUTE_MILLIS);
1646 }
1647
1648 /**
1649 * This method returns the time of <em>bain hashmashos</em> based on the
1650 * calculation of 13.5 minutes (3/4 of an 18 minute mil before shkiah
1651 * calculated as {@link #getTzaisGeonim7Point083Degrees() 7.083°}.
1652 *
1653 * @return the <code>Date</code> of the bain hashmashos of Rabainu Tam in
1654 * this calculation.
1655 * @see #getTzaisGeonim7Point083Degrees()
1656 */
1657 public Date getBainHasmashosRT13Point5MinutesBefore7Point083Degrees() {
1658 return getTimeOffset(getSunsetOffsetByDegrees(ZENITH_7_POINT_083),
1659 -13.5 * MINUTE_MILLIS);
1660 }
1661
1662 /**
1663 * This method returns <em>bain hashmashos</em> of Rabainu Tam calculated in
1664 * the opinion of the Divray Yosef (see Yisrael Vehazmanim) calculated
1665 * 5/18th (27.77%) of the time between alos (calculated as 19.8° before
1666 * sunrise) and sunrise. This is added to sunset to arrive at the time for
1667 * bain hashmashos of Rabainu Tam).
1668 *
1669 * @return the <code>Date</code> of bain hashmashos of Rabainu Tam for this
1670 * calculation.
1671 */
1672 public Date getBainHasmashosRT2Stars() {
1673 Date alos19Point8 = getAlos19Point8Degrees();
1674 Date sunrise = getSeaLevelSunrise();
1675 if (alos19Point8 == null || sunrise == null) {
1676 return null;
1677 }
1678 return getTimeOffset(getSeaLevelSunset(),
1679 (sunrise.getTime() - alos19Point8.getTime()) * (5 / 18d));
1680 }
1681
1682 /**
1683 * This method returns the <em>tzais</em> (nightfall) based on the opinion
1684 * of the <em>Geonim</em> calculated at the sun's position at
1685 * {@link #ZENITH_5_POINT_95 5.95°} below the western horizon.
1686 *
1687 * @return the <code>Date</code> representing the time when the sun is
1688 * 5.95° below sea level.
1689 * @see #ZENITH_5_POINT_95
1690 */
1691 // public Date getTzaisGeonim3Point7Degrees() {
1692 // return getSunsetOffsetByDegrees(ZENITH_3_POINT_7);
1693 // }
1694 /**
1695 * This method returns the <em>tzais</em> (nightfall) based on the opinion
1696 * of the <em>Geonim</em> calculated at the sun's position at
1697 * {@link #ZENITH_5_POINT_95 5.95°} below the western horizon.
1698 *
1699 * @return the <code>Date</code> representing the time when the sun is
1700 * 5.95° below sea level.
1701 * @see #ZENITH_5_POINT_95
1702 */
1703 public Date getTzaisGeonim5Point95Degrees() {
1704 return getSunsetOffsetByDegrees(ZENITH_5_POINT_95);
1705 }
1706
1707 /**
1708 * This method returns the <em>tzais</em> (nightfall) based on the opinion
1709 * of the <em>Geonim</em> calculated at the sun's position at
1710 * {@link #ZENITH_7_POINT_083 7.083°} below the western horizon.
1711 *
1712 * @return the <code>Date</code> representing the time when the sun is
1713 * 7.083° below sea level.
1714 * @see #ZENITH_7_POINT_083
1715 */
1716 public Date getTzaisGeonim7Point083Degrees() {
1717 return getSunsetOffsetByDegrees(ZENITH_7_POINT_083);
1718 }
1719
1720 /**
1721 * This method returns the <em>tzais</em> (nightfall) based on the opinion
1722 * of the <em>Geonim</em> calculated at the sun's position at
1723 * {@link #ZENITH_8_POINT_5 8.5°} below the western horizon.
1724 *
1725 * @return the <code>Date</code> representing the time when the sun is
1726 * 8.5° below sea level.
1727 * @see #ZENITH_8_POINT_5
1728 */
1729 public Date getTzaisGeonim8Point5Degrees() {
1730 return getSunsetOffsetByDegrees(ZENITH_8_POINT_5);
1731 }
1732
1733 /**
1734 * This method returns the <em>tzais</em> (nightfall) based on the opinion
1735 * of the Chavas Yair and Divray Malkiel that the time to walk the distance
1736 * of a Mil is 15 minutes for a total of 60 minutes for 4 mil after
1737 * {@link #getSeaLevelSunset() sea level sunset}.
1738 *
1739 * @return the <code>Date</code> representing 60 minutes after sea level
1740 * sunset.
1741 * @see #getAlos60()
1742 */
1743 public Date getTzais60() {
1744 return getTimeOffset(getSeaLevelSunset(), 60 * MINUTE_MILLIS);
1745 }
1746
1747 /**
1748 * This method returns tzais usually calculated as 40 minutes after sunset.
1749 * Please note that Chacham Yosef Harari-Raful of Yeshivat Ateret Torah who
1750 * uses this time, does so only for calculating various other zmanai hayom
1751 * such as Sof Zman Krias Shema and Plag Hamincha. His calendars do not
1752 * publish a zman for Tzais. It should also be noted that Chacham
1753 * Harari-Raful provided a 25 minute zman for Israel. This API uses 40
1754 * minutes year round in any place on the globe by default. This offset can
1755 * be changed by calling {@link #setAteretTorahSunsetOffset(double)}.
1756 *
1757 * @return the <code>Date</code> representing 40 minutes after sea level
1758 * sunset
1759 * @see #getAteretTorahSunsetOffset()
1760 * @see #setAteretTorahSunsetOffset(double)
1761 */
1762 public Date getTzaisAteretTorah() {
1763 return getTimeOffset(getSeaLevelSunset(), getAteretTorahSunsetOffset()
1764 * MINUTE_MILLIS);
1765 }
1766
1767 /**
1768 * Returns the offset in minutes after sunset used to calculate
1769 * <em>tzais</em> for the Ateret Torah zmanim. The defaullt value is 40
1770 * minutes.
1771 *
1772 * @return the number of minutes after sunset for Tzais.
1773 * @see #setAteretTorahSunsetOffset(double)
1774 */
1775 public double getAteretTorahSunsetOffset() {
1776 return ateretTorahSunsetOffset;
1777 }
1778
1779 /**
1780 * Allows setting the offset in minutes after sunset for the Ateret Torah
1781 * zmanim. The default if unset is 40 minutes. Chacham Yosef Harari-Raful of
1782 * Yeshivat Ateret Torah uses 40 minutes globally with the exception of
1783 * Israel where a 25 minute offset is used. This 25 minute (or any other)
1784 * offset can be overridden by this methd. This offset impacts all Ateret
1785 * Torah methods.
1786 *
1787 * @param ateretTorahSunsetOffset
1788 * the number of minutes after sunset to use as an offset for the
1789 * Ateret Torah <em>tzais</em>
1790 * @see #getAteretTorahSunsetOffset()
1791 */
1792 public void setAteretTorahSunsetOffset(double ateretTorahSunsetOffset) {
1793 this.ateretTorahSunsetOffset = ateretTorahSunsetOffset;
1794 }
1795
1796 /**
1797 * This method returns the latest <em>zman krias shema</em> (time to say
1798 * Shema in the morning) based on the calculation of Chacham Yosef
1799 * Harari-Raful of Yeshivat Ateret Torah, that the day starts
1800 * {@link #getAlos72Zmanis() 1/10th of the day} before sunrise and is
1801 * usually calculated as ending {@link #getTzaisAteretTorah() 40 minutes
1802 * after sunset}. <em>shaos zmaniyos</em> are calculated based on this day
1803 * and added to {@link #getAlos72Zmanis() alos} to reach this time. This
1804 * time is 3 <em> {@link #getShaahZmanisAteretTorah() shaos zmaniyos}</em>
1805 * (temporal hours) after {@link #getAlos72Zmanis() alos 72 zmaniyos}.<br />
1806 * <b>Note: </b> Based on this calculation <em>chatzos</em> will not be at
1807 * midday.
1808 *
1809 * @return the <code>Date</code> of the latest zman shema based on this
1810 * calculation.
1811 * @see #getAlos72Zmanis()
1812 * @see #getTzaisAteretTorah()
1813 * @see #getAteretTorahSunsetOffset()
1814 * @see #setAteretTorahSunsetOffset(double)
1815 * @see #getShaahZmanisAteretTorah()
1816 */
1817 public Date getSofZmanShmaAteretTorah() {
1818 return getTimeOffset(getAlos72Zmanis(), getShaahZmanisAteretTorah() * 3);
1819 }
1820
1821 /**
1822 * This method returns the latest <em>zman tfila</em> (time to say the
1823 * morning prayers) based on the calculation of Chacham Yosef Harari-Raful
1824 * of Yeshivat Ateret Torah, that the day starts {@link #getAlos72Zmanis()
1825 * 1/10th of the day} before sunrise and and is usually calculated as ending
1826 * {@link #getTzaisAteretTorah() 40 minutes after sunset}.
1827 * <em>shaos zmaniyos</em> are calculated based on this day and added to
1828 * {@link #getAlos72Zmanis() alos} to reach this time. This time is 4
1829 * <em>{@link #getShaahZmanisAteretTorah() shaos zmaniyos}</em> (temporal
1830 * hours) after {@link #getAlos72Zmanis() alos 72 zmaniyos}.<br />
1831 * <b>Note: </b> Based on this calculation <em>chatzos</em> will not be at
1832 * midday.
1833 *
1834 * @return the <code>Date</code> of the latest zman shema based on this
1835 * calculation.
1836 * @see #getAlos72Zmanis()
1837 * @see #getTzaisAteretTorah()
1838 * @see #getShaahZmanisAteretTorah()
1839 * @see #setAteretTorahSunsetOffset(double)
1840 */
1841 public Date getSofZmanTfilahAteretTorah() {
1842 return getTimeOffset(getAlos72Zmanis(), getShaahZmanisAteretTorah() * 4);
1843 }
1844
1845 /**
1846 * This method returns the time of <em>mincha gedola</em> based on the
1847 * calculation of Chacham Yosef Harari-Raful of Yeshivat Ateret Torah, that
1848 * the day starts {@link #getAlos72Zmanis() 1/10th of the day} before
1849 * sunrise and and is usually calculated as ending
1850 * {@link #getTzaisAteretTorah() 40 minutes after sunset}. This is the
1851 * perfered earliest time to pray <em>mincha</em> in the opinion of the
1852 * Ramba"m and others. For more information on this see the documentation on
1853 * <em>{@link #getMinchaGedola() mincha gedola}</em>. This is calculated as
1854 * 6.5 {@link #getShaahZmanisAteretTorah() solar hours} after alos. The
1855 * calculation used is 6.5 * {@link #getShaahZmanisAteretTorah()} after
1856 * {@link #getAlos72Zmanis() alos}.
1857 *
1858 * @see #getAlos72Zmanis()
1859 * @see #getTzaisAteretTorah()
1860 * @see #getShaahZmanisAteretTorah()
1861 * @see #getMinchaGedola()
1862 * @see #getMinchaKetanaAteretTorah()
1863 * @see ZmanimCalendar#getMinchaGedola()
1864 * @return the <code>Date</code> of the time of mincha gedola.
1865 */
1866 public Date getMinchaGedolaAteretTorah() {
1867 return getTimeOffset(getAlos72Zmanis(),
1868 getShaahZmanisAteretTorah() * 6.5);
1869 }
1870
1871 /**
1872 * This method returns the time of <em>mincha ketana</em> based on the
1873 * calculation of Chacham Yosef Harari-Raful of Yeshivat Ateret Torah, that
1874 * the day starts {@link #getAlos72Zmanis() 1/10th of the day} before
1875 * sunrise and and is usually calculated as ending
1876 * {@link #getTzaisAteretTorah() 40 minutes after sunset}. This is the
1877 * perfered earliest time to pray <em>mincha</em> in the opinion of the
1878 * Ramba"m and others. For more information on this see the documentation on
1879 * <em>{@link #getMinchaGedola() mincha gedola}</em>. This is calculated as
1880 * 9.5 {@link #getShaahZmanisAteretTorah() solar hours} after
1881 * {@link #getAlos72Zmanis() alos}. The calculation used is 9.5 *
1882 * {@link #getShaahZmanisAteretTorah()} after {@link #getAlos72Zmanis()
1883 * alos}.
1884 *
1885 * @see #getAlos72Zmanis()
1886 * @see #getTzaisAteretTorah()
1887 * @see #getShaahZmanisAteretTorah()
1888 * @see #getMinchaGedola()
1889 * @see #getMinchaKetana()
1890 * @return the <code>Date</code> of the time of mincha ketana.
1891 */
1892 public Date getMinchaKetanaAteretTorah() {
1893 return getTimeOffset(getAlos72Zmanis(),
1894 getShaahZmanisAteretTorah() * 9.5);
1895 }
1896
1897 /**
1898 * This method returns the time of <em>plag hamincha</em> based on the
1899 * calculation of Chacham Yosef Harari-Raful of Yeshivat Ateret Torah, that
1900 * the day starts {@link #getAlos72Zmanis() 1/10th of the day} before
1901 * sunrise and and is usually calculated as ending
1902 * {@link #getTzaisAteretTorah() 40 minutes after sunset}.
1903 * <em>shaos zmaniyos</em> are calculated based on this day and added to
1904 * {@link #getAlos72Zmanis() alos} to reach this time. This time is 10.75
1905 * <em>{@link #getShaahZmanisAteretTorah() shaos zmaniyos}</em> (temporal
1906 * hours) after {@link #getAlos72Zmanis() dawn}.
1907 *
1908 * @return the <code>Date</code> of the plag.
1909 * @see #getAlos72Zmanis()
1910 * @see #getTzaisAteretTorah()
1911 * @see #getShaahZmanisAteretTorah()
1912 */
1913 public Date getPlagHaminchaAteretTorah() {
1914 return getTimeOffset(getAlos72Zmanis(),
1915 getShaahZmanisAteretTorah() * 10.75);
1916 }
1917
1918 /**
1919 * This method returns the time of <em>misheyakir</em> based on the common
1920 * calculation of the Syrian community in NY that the alos is a fixed minute
1921 * offset from day starting {@link #getAlos72Zmanis() 1/10th of the day}
1922 * before sunrise. The common offsets are 6 minutes (based on th Pri
1923 * Megadim, but not linked to the calculation of Alos as 1/10th of the day),
1924 * 8 and 18 minutes (possibly attributed to Chacham Baruch Ben Haim). Since
1925 * there is no universal accepted offset, the user of this API will have to
1926 * specify one. Chacham Yosef Harari-Raful of Yeshivat Ateret Torah does not
1927 * supply any zman for misheyakir and does not endorse any specific
1928 * calculation for misheyakir. For that reason, this method is not enabled.
1929 *
1930 * @param minutes
1931 * the number of minutes after alos calculated as
1932 * {@link #getAlos72Zmanis() 1/10th of the day}
1933 * @return the <code>Date</code> of misheyakir
1934 * @see #getAlos72Zmanis()
1935 */
1936 // public Date getMesheyakirAteretTorah(double minutes) {
1937 // return getTimeOffset(getAlos72Zmanis(), minutes * MINUTE_MILLIS);
1938 // }
1939 /**
1940 * Method to return <em>tzais</em> (dusk) calculated as 72 minutes zmaniyos,
1941 * or 1/10th of the day after {@link #getSeaLevelSunset() sea level sunset}.
1942 *
1943 * @return the <code>Date</code> representing the time.
1944 * @see #getAlos72Zmanis()
1945 */
1946 public Date getTzais72Zmanis() {
1947 long shaahZmanis = getShaahZmanisGra();
1948 if (shaahZmanis == Long.MIN_VALUE) {
1949 return null;
1950 }
1951 return getTimeOffset(getSeaLevelSunset(), shaahZmanis * 1.2);
1952 }
1953
1954 /**
1955 * Method to return <em>tzais</em> (dusk) calculated using 90 minutes
1956 * zmaniyos (<em>GR"A</em> and the <em>Baal Hatanya</em>) after
1957 * {@link #getSeaLevelSunset() sea level sunset}.
1958 *
1959 * @return the <code>Date</code> representing the time.
1960 * @see #getAlos90Zmanis()
1961 */
1962 public Date getTzais90Zmanis() {
1963 long shaahZmanis = getShaahZmanisGra();
1964 if (shaahZmanis == Long.MIN_VALUE) {
1965 return null;
1966 }
1967 return getTimeOffset(getSeaLevelSunset(), shaahZmanis * 1.5);
1968 }
1969
1970 /**
1971 * Method to return <em>tzais</em> (dusk) calculated using 96 minutes
1972 * zmaniyos (<em>GR"A</em> and the <em>Baal Hatanya</em>) after
1973 * {@link #getSeaLevelSunset() sea level sunset}.
1974 *
1975 * @return the <code>Date</code> representing the time.
1976 * @see #getAlos96Zmanis()
1977 */
1978 public Date getTzais96Zmanis() {
1979 long shaahZmanis = getShaahZmanisGra();
1980 if (shaahZmanis == Long.MIN_VALUE) {
1981 return null;
1982 }
1983 return getTimeOffset(getSeaLevelSunset(), shaahZmanis * 1.6);
1984 }
1985
1986 /**
1987 * Method to return <em>tzais</em> (dusk) calculated as 90 minutes after sea
1988 * level sunset. This method returns <em>tzais</em> (nightfall) based on the
1989 * opinion of the Magen Avraham that the time to walk the distance of a Mil
1990 * in the Ramba"m's opinion is 18 minutes for a total of 90 minutes based on
1991 * the opinion of <em>Ula</em> who calculated <em>tzais</em> as 5 Mil after
1992 * sea level shkiah (sunset). A similar calculation
1993 * {@link #getTzais19Point8Degrees()}uses solar position calculations based
1994 * on this time.
1995 *
1996 * @return the <code>Date</code> representing the time.
1997 * @see #getTzais19Point8Degrees()
1998 * @see #getAlos90()
1999 */
2000 public Date getTzais90() {
2001 return getTimeOffset(getSeaLevelSunset(), 90 * MINUTE_MILLIS);
2002 }
2003
2004 /**
2005 * This method returns <em>tzais</em> (nightfall) based on the opinion of
2006 * the Magen Avraham that the time to walk the distance of a Mil in the
2007 * Ramba"ms opinion is 2/5 of an hour (24 minutes) for a total of 120
2008 * minutes based on the opinion of <em>Ula</em> who calculated
2009 * <em>tzais</em> as 5 Mil after sea level shkiah (sunset). A similar
2010 * calculation {@link #getTzais26Degrees()} uses temporal calculations based
2011 * on this time.
2012 *
2013 * @return the <code>Date</code> representing the time.
2014 * @see #getTzais26Degrees()
2015 * @see #getAlos120()
2016 */
2017 public Date getTzais120() {
2018 return getTimeOffset(getSeaLevelSunset(), 120 * MINUTE_MILLIS);
2019 }
2020
2021 /**
2022 * Method to return <em>tzais</em> (dusk) calculated using 120 minutes
2023 * zmaniyos (<em>GR"A</em> and the <em>Baal Hatanya</em>) after
2024 * {@link #getSeaLevelSunset() sea level sunset}.
2025 *
2026 * @return the <code>Date</code> representing the time.
2027 * @see #getAlos120Zmanis()
2028 */
2029 public Date getTzais120Zmanis() {
2030 long shaahZmanis = getShaahZmanisGra();
2031 if (shaahZmanis == Long.MIN_VALUE) {
2032 return null;
2033 }
2034 return getTimeOffset(getSeaLevelSunset(), shaahZmanis * 2.0);
2035 }
2036
2037 /**
2038 * For information on how this is calculated see the comments on
2039 * {@link #getAlos16Point1Degrees()}
2040 *
2041 * @return the <code>Date</code> representing the time.
2042 * @see #getTzais72()
2043 * @see #getAlos16Point1Degrees() for more information on this calculation.
2044 */
2045 public Date getTzais16Point1Degrees() {
2046 return getSunsetOffsetByDegrees(ZENITH_16_POINT_1);
2047 }
2048
2049 /**
2050 * For information on how this is calculated see the comments on
2051 * {@link #getAlos26Degrees()}
2052 *
2053 * @return the <code>Date</code> representing the time.
2054 * @see #getTzais120()
2055 * @see #getAlos26Degrees()
2056 */
2057 public Date getTzais26Degrees() {
2058 return getSunsetOffsetByDegrees(ZENITH_26_DEGREES);
2059 }
2060
2061 /**
2062 * For information on how this is calculated see the comments on
2063 * {@link #getAlos18Degrees()}
2064 *
2065 * @return the <code>Date</code> representing the time.
2066 * @see #getAlos18Degrees()
2067 */
2068 public Date getTzais18Degrees() {
2069 return getSunsetOffsetByDegrees(ASTRONOMICAL_ZENITH);
2070 }
2071
2072 /**
2073 * For information on how this is calculated see the comments on
2074 * {@link #getAlos19Point8Degrees()}
2075 *
2076 * @return the <code>Date</code> representing the time.
2077 * @see #getTzais90()
2078 * @see #getAlos19Point8Degrees()
2079 */
2080 public Date getTzais19Point8Degrees() {
2081 return getSunsetOffsetByDegrees(ZENITH_19_POINT_8);
2082 }
2083
2084 /**
2085 * A method to return <em>tzais</em> (dusk) calculated as 96 minutes after
2086 * sea level sunset. For information on how this is calculated see the
2087 * comments on {@link #getAlos96()}.
2088 *
2089 * @return the <code>Date</code> representing the time.
2090 * @see #getAlos96()
2091 */
2092 public Date getTzais96() {
2093 return getTimeOffset(getSeaLevelSunset(), 96 * MINUTE_MILLIS);
2094 }
2095
2096 /**
2097 * A method that returns the local time for fixed <em>chatzos</em>. This
2098 * time is noon and midnight adjusted from standard time to account for the
2099 * local latitude. The 360° of the globe divided by 24 calculates to
2100 * 15° per hour with 4 minutes per degree, so at a longitude of 0 , 15,
2101 * 30 etc Chatzos in 12:00 noon. Lakewood, NJ whose longitude is -74.2094 is
2102 * 0.7906 away from the closest multiple of 15 at -75°. This is
2103 * multiplied by 4 to yeild 3 minutes and 10 seconds for a chatzos of
2104 * 11:56:50. This method is not tied to the theoretical 15° timezones,
2105 * but will adjust to the actual timezone and <a
2106 * href="http://en.wikipedia.org/wiki/Daylight_saving_time">Daylight saving
2107 * time</a>.
2108 *
2109 * @return the Date representing the local <em>chatzos</em>
2110 * @see GeoLocation#getLocalMeanTimeOffset()
2111 */
2112 public Date getFixedLocalChatzos() {
2113 return getTimeOffset(getDateFromTime(12.0
2114 - getGeoLocation().getTimeZone().getRawOffset() / HOUR_MILLIS),
2115 -getGeoLocation().getLocalMeanTimeOffset());
2116 }
2117
2118 /**
2119 * A method that returns the latest <em>zman krias shema</em> (time to say
2120 * Shema in the morning) calculated as 3 hours before
2121 * {@link #getFixedLocalChatzos()}.
2122 *
2123 * @return the <code>Date</code> of the latest zman shema.
2124 * @see #getFixedLocalChatzos()
2125 * @see #getSofZmanTfilaFixedLocal()
2126 */
2127 public Date getSofZmanShmaFixedLocal() {
2128 return getTimeOffset(getFixedLocalChatzos(), -180 * MINUTE_MILLIS);
2129 }
2130
2131 /**
2132 * This method returns the latest <em>zman tfila</em> (time to say the
2133 * morning prayers) calculated as 2 hours before
2134 * {@link #getFixedLocalChatzos()}.
2135 *
2136 * @return the <code>Date</code> of the latest zman tfila.
2137 * @see #getFixedLocalChatzos()
2138 * @see #getSofZmanShmaFixedLocal()
2139 */
2140 public Date getSofZmanTfilaFixedLocal() {
2141 return getTimeOffset(getFixedLocalChatzos(), -120 * MINUTE_MILLIS);
2142 }
2143
2144 /**
2145 * @see java.lang.Object#equals(Object)
2146 */
2147 public boolean equals(Object object) {
2148 if (this == object) {
2149 return true;
2150 }
2151 if (!(object instanceof ComplexZmanimCalendar)) {
2152 return false;
2153 }
2154 ComplexZmanimCalendar cCal = (ComplexZmanimCalendar) object;
2155 // return getCalendar().getTime().equals(cCal.getCalendar().getTime())
2156 return getCalendar().equals(cCal.getCalendar())
2157 && getGeoLocation().equals(cCal.getGeoLocation())
2158 && getAstronomicalCalculator().equals(
2159 cCal.getAstronomicalCalculator());
2160 }
2161
2162 /**
2163 * @see java.lang.Object#hashCode()
2164 */
2165 public int hashCode() {
2166 int result = 17;
2167 result = 37 * result + getClass().hashCode(); // needed or this and
2168 // subclasses will
2169 // return identical hash
2170 result += 37 * result + getCalendar().hashCode();
2171 result += 37 * result + getGeoLocation().hashCode();
2172 result += 37 * result + getAstronomicalCalculator().hashCode();
2173 return result;
2174 }
2175 }