3.1.0 (2026-11-02)
GeoLocationAdds support for eastern and western horizon elevation for sunrise and sunset.- Significant rewrite of the SPACalculator to more closely match other implementations, while boosting performance.
- Calculators now cache sunrise, sunset, noon and midnight results, which significantly speeds up generating many zmanim. For example, a day’s calendar needs sunrise several times (for sunrise itself, sof zman krias shema GRA, and others); it is now calculated once. Cached results are only reused for identical inputs, so results are exactly the same as without caching. Caching is on by default and can be turned off with
setUseResultCache(false). - The SPA and Meeus calculators are faster, because they now reuse the parts of each day’s calculation that are the same for every zman. The SPA calculator was also brought in line with the reference implementation, and now matches it to within about 2 ms. It also now correctly reports no event on polar days where it previously could return an incorrect time. In addition, SPA no longer evaluates its full, expensive solar-position series at every step of a calculation. It evaluates the series at a few points per day, interpolates between them, and verifies every result against the full calculation, falling back to it when needed. This makes it several times faster than the reference implementation, with no loss of accuracy.
NOAACalculator,MeeusCalculator: Check solar midnight before reporting no event.NOAACalculator,MeeusCalculator: Don't miss zmanim the sun only just reaches.ComprehensiveZmanimCalendar: Returnnullfor zmanim that fall outside the day on very short polar days, instead of an invalid time:getMinchaGedola30Minutes()andgetMinchaGedolaGRAFixedLocalChatzos30Minutes()when the result is after sunset (also avoids aNullPointerExceptionduring polar night).getSofZmanShma3HoursBeforeChatzos()andgetSofZmanTfila2HoursBeforeChatzos()when the result is before sunrise.getFixedLocalChatzosHayom()when fixed local chatzos is before sunrise or after sunset, along with the half-day zmanim based on it.getBainHashmashosYereim18Minutes(),getBainHashmashosYereim16Point875Minutes()andgetBainHashmashosYereim13Point5Minutes()when the result is before plag hamincha GRA.getMinchaKetanaAteretTorah(),getPlagHaminchaAteretTorah(),getMinchaKetanaAhavatShalom()andgetPlagAhavatShalom()when the result is after sunset.
ComprehensiveZmanimCalendar:getMinchaGedolaGreaterThan30()andgetMinchaGedolaAhavatShalom()fall back to the regular mincha gedola when 30 minutes after chatzos is after sunset.ZmanimCalendargetCandleLighting()returnsnullwhen candle lighting would be before plag hamincha GRA (very short winter days).isAssurBemelacha()now throws a descriptiveIllegalStateExceptionwhen a day boundary it needs (sunset on erev Shabbos/Yom Tov, tzais on Shabbos/Yom Tov) can't be determined, such as in polar regions, instead of aNullPointerException. Results are unchanged wherever the boundaries exist.
ZmanimFormatter: Fix a thread-safety issue in duration formatting (shared staticDecimalFormatinstances are now per-instance).
3.0.0 (2026-10-21)
- Remove deprecated methods flagged for removal, including
ComprehensiveZmanimcalendarclassgetSofZmanShmaKolEliyahu()getTzaisGeonim3Point65Degrees()- was prior to 13.5 minutes in Yerushalayim at the equinox/equilux.getTzaisGeonim3Point676Degrees()- was prior to 13.5 minutes in Yerushalayim at the equinox/equilux.getSofZmanTfilahAteretTorah()- use thegetSofZmanTfilaAteretTorah()getSofZmanShmaFixedLocal()getSofZmanTfilaFixedLocal()getMinchaGedolaBaalHatanyaGreaterThan30()should now be calculated viaZmanimCalendar.getMinchaGedolaGreaterThan30(Instant minchaGedolaBaalHatanya)getFixedLocalChatzosBasedZmanim(Date, Date, double)- was replaced by the more generic
ZmanimCalendar.getHalfDayBasedZman(Date, Date, double)method
- was replaced by the more generic
- Move
getSunriseBaalHatanya()andgetSunsetBaalHatanya()to the parentZmanimCalendarclass. - various mispelled
getBainHasmashos()based zmanim (use the properly spelled getBainHasmashos versions
JewishCalendarclassisVeseinTalUmatarStartDate()- useTefilaRules.isVeseinTalUmatarStartDate()isVeseinTalUmatarStartingTonight()- useTefilaRules.isVeseinTalUmatarStartingTonight()isVeseinTalUmatarRecited()- useTefilaRiles.isVeseinTalUmatarRecited()isVeseinBerachaRecited()- useTefilaRules.isVeseinBerachaRecited()isMashivHaruachStartDate- useTefilaRules.isMashivHaruachStartDate()isMashivHaruachEndDate()- useTefilaRules.isMashivHaruachEndDate()isMashivHaruachRecited()- useTefilaRules.isMashivHaruachRecited()isMoridHatalRecited()- useTefilaRules.isMoridHatalRecited()
- Remove deprecated redundant GeoLocationUtils. Use the GeoLocation class instead.
- Remove the com.kosherjava.util.Time class. Now that Sha'os zmaniyos use the java.time.Duration class, this was obsolete.
- UTF-8 is here. A number of clases have Hebrew in the documentation and code (especially the HebrewDateFormatter class).
- Move some methods from
ComprehensiveZmanimCalendarto the parentZaminCalendarclasses.getShaahZmanis72Minutes()getAlos16Point1Degrees()getSofZmanShmaMGA72Minutes()getSofZmanTfilaMGA72Minutes()getTzaisGeonim8Point5Degrees()getZmanisBasedOffset(double)
ZmanimCalendarclass rename some generically named method names to be more specific. The actual zmanim were not changed.- rename
getTzais()->getTzaisGeonim8Point5Degrees() getAlosHashachar()->getAlos16Point1Degrees()getSofZmanShmaMGA()->getSofZmanShmaMGA72Minutes()getSofZmanTfilaMGA()->getSofZmanTfilaMGA72Minutes()getMinchaGedola()->getMinchaGedolaGRA()getMinchaKetana()->getMinchaKetanaGRA()getPlagHamincha()->getPlagHaminchaGRA()getShaahZmanisMGA()->getShaahZmanis72Minutes()getAlos72()->getAlos72Minutes()getTzais72()->getTzais72Minutes()getShaahZmanisGra()->getShaahZmanisGRA()getAlos120()->getAlos120Minutes()getAlos96()->getAlos96Minutes()getAlos90()->getAlos90Minutes()getAlos72()->getAlos72Minutes()getAlos60()->getAlos60Minutes()getTzais50()->getTzais50Minutes()getTzais60()->getTzais60Minutes()getTzais72()->getTzais72Minutes()getTzais90()->getTzais90Minutes()getTzais96()->getTzais96Minutes()getTzais120()->getTzais120Minutes()getChatzos()->getChatzosHayom()getChatzosAsHalfDay()->getChatzosHayomAsHalfDay()isAssurBemlacha()->isAssurBemelacha()
- rename
- Rename some classes the confusingly named
ComplexZmanimCalendartoComrehensiveZmanimCalendar. - Move "legacy" classes to
java.timeequivelants- All zmanim now return
Instants insead ofDateobjects. - Replace
SimpledateFormatwithDateTimeFormatter CalendarandGregorianCalendarwere replaced withLocalDateorZonedDateTime.TimeZonewas replace withZoneIdGeoLocation.getLocalMeanTimeOffset()andgetAntimeridianAdjustment()now takes inInstantparameter.- Remove the no longer necessary
NOAACalculator.adjustHourForTimeZone(Calendar)
- All zmanim now return
getSofZman*Chametz*times will retun null if it is not Erev Pesach.- Move ErevPesach zmanim calculations from the
ComprehensiveZmanimCaledarto generic methods in the parentZmanimCalendarclass. Nothing changed in the signatures of the methods in theComprehensivZemanimCalendarclass. - Increase the minimum supported JRE version from version 8 (the code currently almost certainly works on 6 today) to Java 11 or higher.
- Tweaked logic in
AstronomicalCalendar.getInstantFromTime()to address issues near the dateline. - Improve null handling in
ComprehensiveZmanimCalendar.getMoladBasedTime() - Add
ComprehensiveZmanimCalendar.getMisheyakir12Point85Degrees() - Add
getMinchaGedolaGreaterThan30(Instant)that allows it to work with any mincha gedola claculation. ComprehensiveZmanimcalendarrename some methods.- getMinchaGedolaGreaterThan30()
->getMinchaGedolaGRAGreaterThan30()` getShaahZmanisAlos16Point1ToTzais3Point8()->getShaahZmanisAlos16Point1DegreesToTzaisGeonim3Point8Degrees()getShaahZmanisAlos16Point1ToTzais3Point7()->getShaahZmanisAlos16Point1DegreesToTzaisGeonim3Point7Degrees()getSofZmanShmaAlos16Point1ToTzaisGeonim7Point083Degrees()->getSofZmanShmaAlos16Point1DegreesToTzaisGeonim7Point083Degrees()getPlagAlos16Point1ToTzaisGeonim7Point083Degrees() ->getPlagAlos16Point1DegreesToTzaisGeonim7Point083Degrees()
- getMinchaGedolaGreaterThan30()
- Change / remove
ComprehensiveZmanimcalendarzmanim that were too early.getTzaisGeonim4Point37Degrees()->getTzaisGeonim4Point42Degrees().getTzaisGeonim4Point61Degrees()->getTzaisGeonim4Point66Degrees()- Remove
getTzaisGeonim5Point88Degrees()since it is a drop too early
ZmanimCalendarAstronomical Chatzos based changes:- Add
getChatzosHalayla() - Add setting
useAstronomicalChatzos(defaulted to true) to keep the mistaken compat break introduced in the v2.5.0 release. - Add setting
useAstronomicalChatzosForOtherZmanim(defaulted to false). - Add
getChatzosAsHalfDay()to retain the old behavior of chatzos being halfway between sunrise and sunset. - Use
useAstronomicalChatzosto control ifgetChatzos()returnsgetSunTransit()(astronomical chatzos) or getChatzosAsHalfDay(). - Add
getHalfDayBasedZman(Date startOfHalfDay, Date endOfHalfDay, double hours)to allow other zmanim to be impacted by chatzos. - Use
useAstronomicalChatzosForOtherZmanim. ZmanimCalendar- add utility methodgetPercentOfShaahZmanisFromDegrees(double degrees, boolean sunset)to simplify zmaniyos time calculations. This allows calculations of various percentage of the day zmanim calculations.
- Add
- Remove code duplication in
NOAACalculator.getUTCSunrise()and.getUTCSunset() - Use Astronomical Chatzos Halayla (as opposed as halfway between sunset and sunrise or 12 hours after chatzos hayom)
AstronomicalCalculator- addgetSunLowerTransit()AstronomicalCalculator- add abstract methodgetUTCMidnight()NOAACalculator- implementgetUTCMidnight()AstronomicalCalculator- add abstract methodgetUTCMidnight()
ComprehensiveZmanimCalendar- significant updates- Started coding some zmanim to use the half-day zmanim config.
- Change
getFixedLocalChatzosBasedZmanim()in favor ofgetHalfDayBasedZman()in the parent `ZmanimCalendar class. getFixedLocalChatzos()now just calls the new getLocalMeanTime(12.0) in the grandparent AstronomicalCalendar class.- Remove [
getSolarMidnight()] that was added to theAstronomicalCalendargrandparent class. - Undeprecate
getPlagAlosToSunset()since it is not a zman that can be too late. - Add
getSofZmanAchilasChametzMGA72MinutesZmanis()andgetSofZmanBiurChametzMGA72MinutesZmanis() - Add null checks in
getMinchaGedolaAhavatShalom() - Fix
getAlos60()to usegetElevationAdjustedSunrise() - Update Tefila method to Use Consistent Spelling.
- Add
getSunsetOrWesternmostSolarAzimuth()andgetSunriseOrEasternmostSolarAzimuth()methods. - Add
getPolarPlagHaminchaBenIshChai()andgetPolarStartOfDayTeshuvosVehanhagos() - Add
getPolarStartOfDayTeshuvosVehanhagos()
zmanimFormatter now formatsDuration`s and removed support for formatting longs and Time.HebrewdateFormatter- add method
formatParsha(JewishCalendar.Parsha parsha)to allow formatting of a parsha retrieved fromJewishCalendar.getUpcomingParsha(). - Add
getHebrewMonthList()andsetHebrewMonthList(String[]). This allows overriding the default month of Chesvan to Marcheshvan etc. - Throw an
IllegalArgumentExceptionif the array length of months != 14 - Remove the experimental and private
formatMolad(long moladChalakim) - Fixed a bug that ignored the leading 0 format.
- Fix NullPointer in HebrewDateFormatter week formatting
- add method
TefilaRulesJewishCalendarisYomTov()now returns true for 20 Nissan- add missing brace to
isYomTov()and simplify logic getDaysInJewishMonth(int,int)andgetLastDayOfGregorianMonth(int,int)now have parameter order as year, month (it had been month, year).isJewishLeapYear(int)is now public.- Rename
isHavdalahRecited()->isTonightMutarBemelacha() - Added plus and minus methods (matching the
java.time.LocalDateclass) for years, months and days. - Add
getTekufa()andgetTekufaAsInstant() - Rename
ParshatoParshah. This was done in formatters as well.
GeoLocationNOAACalculator- fix Solar Azimuth and ElevationAstronomicalCalculatorAdd some methodsgetSolarAzimuth((Instant, GeoLocation)- the first parameter was a ZonedDateTime earlier in the rewritegetSolarElevation(Instant, GeoLocation)- the first parameter was a ZonedDateTime earlier in the rewritegetTimeAtAzimuth90Or270(double)- Use and Default to Using The sun's apparent angular semi-diameter for that day
- Rename
getSolarRadius(LocalDate)->getApparentSolarRadius(LocalDate)to avoid confusion - Rename a
stronomicalApparentSolarRadius->apparentSolarRadius
AstronomicalCalendar- Fix null handling in
getSunTransit(Date,Date) - Deprecate
getSunriseSolarDipFromOffsetandgetSunsetSolarDipFromOffset - Pass proper parameter to
getDateFromTimeingetLocalMeanTime - Add
getLocalMeanTime(). - Move
getSolarMidnight()to the parent class where it belongs. - Correct USNO noon calculation in some locations where it was sometimes 12 hours off.
- Add
getTimeAtAzimuth(double azimuth) - All sha'os zmaniyos that had returned long (and a Long.MIN_VALUE when N/A) now return java.time.Duration (and a null when N/A)
- Add two new more accurate and slower calculators
MeeusCalculator- a calculator that implements the higher accuracy Jean Meeus algorithmn (the existing NOAACalculator uses the low accuracy implementation)SPACalculator- a higher accuracy calculator
- Deprecate the USNO-Based
SunTimesCalculatorthat is not as accurate as other calculators.
- Fix null handling in
2.5.0 (2023-06-09)
- Update
ComplexZmanimCalendar.getSolarMidnight()to support astronomocal midnight that works even in the Arctic/Antarctic. - Add special Shabbasos/Parshiyos Shuva, Shira, Hagadol, Chazon and Nachamu
- Fix isYomTov() should return false on Erev Shavuos.
- Correct spelling of Bein Hashmashos methods the the
ComplexZmanimCalendar(was missing the second H). - Various Daf Yomi Yerushalmi fixes including:
- Correct calculation of the daf number.
- Correct the order of transliterated Yerushalmi masechtos.
- Correct the Hebrew spelling of the masechta Kilayim.
- Added number of IS methods such as is
isYomKippur(),isSuccos(),isPesach()etc. to theJewishCalendarclass. - Add
isAlHanissimRecited(JewishCalendar)andisYaalehVeyavoRecited(JewishCalendar)to theTefilaRulesclass. - Clarify documentation to explain that isMacharChodesh() Refers to the Haftorah
2.4.0 (2022-11-27)
- JewishCalendar.getUpcomingParshah() that will return the upcoming Parsha regardless of the day of week.
- Change YerushalmiYomiCalculator to return null on Yom Kippur and Tisha Be'Av when there is no Daf.
- Add some Luach Ahavat Shalom Zmanim
- Add BeHaB to the
JewishCalendarclass - Add Yom Kippur Katan and Isru Chag to the
JewishCalendarclass. - Add the
TefilaRulesclass, a utility class for info like:- is vesain tal umatar recited etc.
- is tachanun recited by shacharis or mincha.
- Is hallel or hallel shalem recited
- Deprecate the tefila rules methods that existed in JewishCalendar class in favor of using the ones in the
TefilaRulesclass. - Add
getSamuchLeMinchaKetanazman. - Deprecate
getSofZmanShmaFixedLocal()andgetSofZmanTfilaFixedLocal()with future plans of removal. - Deprecate multiple "dangerous" zmanim as an alert to developers, with plans on retaining them.
2.3.0 (2021-12-07)
- Fix an issue with sof zman kiddush levana being off by an hour when the molad is on one side of the DST change, and the sof zman on the other.
- Add seasonal davening based zmanim including Vesein Tal Umatar/ Vesein Berachah / Mashiv Haruach.
- Add Rav Moshe Feinstein's zmanim used in MTJ and Yeshiva of Staten Island.
- Refactor code for alos and tzeis zmaniyos based time (ports to other languages can simplify things by doing the same).
- Fix Hebrew spelling of Parshas Nitzavim.
2.2.0 (2021-03-15)
- Added JewishCalendar.isTaanisBechoros().
- Updated Javadocs - document sources for
getFixedLocalChatzos()and clarify Yerushalmi Yomi Start Date.
2.1.0 (2020-12-02)
- Added six variants of the Yereim's bain hashmashos zmanim.
AstronomicalCalculator.getRefraction()and.getSolarRadius()now have public access.- Deprecate the
GeoLocationUtilsclass. All of its functionality is in theGeoLocationclass. - Updated JavaDocs (no more errors or warnings).
- Added Lag Ba'omer.
- Added Shushan Purim Katan.
- Added
Daf.setMasechtaTransliterated(String[] masechtosBavliTransliterated)andDaf.setYerushlmiMasechtaTransliterated(String[] masechtosYerushalmiTransliterated). - Simplify and reduce code duplication in
ZmanimCalendargeneric zmanim calculations. - Fix
AstronomicalCalendargetSunriseSolarDipFromOffset()andgetSunsetSolarDipFromOffset(they are still inefficient) to properly allow calculations before and after sun rise/set. - Change some Hebrew lists that are not expected to change to be final.
- Semver change (just a versioning change).
- Fix JavaDoc references to new package structure.
- Fix #160
isShabbosMevorchimshould return false for the month of Tishrei. - Fix #161 a mistake in
Zman.toString(). - Fix java 6 compilation issues.
- Changed package structure to
com.kosherjava.zmanimfromnet.sourceforge.zmanim. - Added Maven and Gradle support.
- Use DST for TimeZone display name (#150).
- Convert
formatMolad()to static. - Convert
getTimeOffset()to static. - Pass alos and tzais parameters for
TchilasZmanKidushLevana3Days. - Historical daf yomi dates should be final.
- Add Birkas Hachama, update documentation.
- Update formatter class for Enums in
JewishCalendar.
- Default calculator changed from USNO to NOAA.
- Remove the redundant
ZmanimCalculatorclass (backwards breaking if you used this calculator). - Support optional elevation adjustments for zmanim besides sunrise and sunset.
- Added multiple alternative zmanim .
- Added Baal Hatanya zmanim.
- Replaced GPL parsha code with an LGPL kosher version.
- Added JSON serialization / output (was previously limited to XML).
- Add Daf Yomi Yerishalmi.
- Many
JewishCalendarrelated tweaks and enhancements. - Many minor bug fixes and enhancements.
See GitHub Commits for more details.