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