Class NOAACalculator
java.lang.Object
com.kosherjava.zmanim.util.AstronomicalCalculator
com.kosherjava.zmanim.util.NOAACalculator
- All Implemented Interfaces:
Cloneable
Implementation of sunrise and sunset methods to calculate astronomical times based on the NOAA algorithm. This calculator uses the Java algorithm based on the implementation by NOAA - National Oceanic and Atmospheric Administration's Surface Radiation Research Branch. NOAA's implementation is based on equations from Astronomical Algorithms by Jean Meeus. Added to the algorithm is an adjustment of the zenith
to account for elevation. The algorithm can be found in the Wikipedia Sunrise Equation article.
- Author:
- © Eliyahu Hershfeld 2011 - 2025
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static enum -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final doubleThe Julian day of January 1, 2000, known as J2000.0.private static final doubleJulian days per century. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate intadjustHourForTimeZone(Calendar calendar) Returns the hour of day adjusted for the timezone and DST.Returns the name of the algorithm.private static doublegetEarthOrbitEccentricity(double julianCenturies) Return the unitless eccentricity of earth's orbit.private static doublegetEquationOfTime(double julianCenturies) Return the Equation of Time - the difference between true solar time and mean solar timeprivate static doublegetJulianCenturiesFromJulianDay(double julianDay) Convert Julian day to centuries since J2000.0.private static doublegetJulianDay(Calendar calendar) Return the Julian day from a Java Calendar.private static doublegetMeanObliquityOfEcliptic(double julianCenturies) Returns the mean obliquity of the ecliptic (Axial tilt).private static doublegetObliquityCorrection(double julianCenturies) Returns the corrected obliquity of the ecliptic (Axial tilt).doublegetSolarAzimuth(Calendar calendar, GeoLocation geoLocation) Return the Solar Azimuth for the horizontal coordinate system at the given location at the given time.doublegetSolarElevation(Calendar calendar, GeoLocation geoLocation) Return the Solar Elevation for the horizontal coordinate system at the given location at the given time.private doublegetSolarElevationAzimuth(Calendar calendar, GeoLocation geoLocation, boolean isAzimuth) Return the Solar Elevation or Solar Azimuth at the given location and time.private static doublegetSolarNoonMidnightUTC(double julianDay, double longitude, NOAACalculator.SolarEvent solarEvent) Return the Universal Coordinated Time (UTC) of the current day solar noon or the the upcoming midnight (about 12 hours after solar noon) of the given day at the given location on earth.private static doublegetSunApparentLongitude(double julianCenturies) Return the apparent longitude of the sun.private static doublegetSunDeclination(double julianCenturies) Return the declination of the sun.private static doublegetSunEquationOfCenter(double julianCenturies) Returns the equation of center for the sun in degrees.private static doublegetSunGeometricMeanAnomaly(double julianCenturies) Returns the Geometric Mean Anomaly of the Sun in degrees.private static doublegetSunGeometricMeanLongitude(double julianCenturies) Returns the Geometric Mean Longitude of the Sun.private static doublegetSunHourAngle(double latitude, double solarDeclination, double zenith, NOAACalculator.SolarEvent solarEvent) Return the hour angle of the sun in radians at for the latitude.private static doublegetSunRiseSetUTC(Calendar calendar, double latitude, double longitude, double zenith, NOAACalculator.SolarEvent solarEvent) Return the Universal Coordinated Time (UTC) of sunrise or sunset in minutes for the given day at the given location on earth.private static doublegetSunTrueLongitude(double julianCenturies) Return the true longitude of the sun.doublegetUTCMidnight(Calendar calendar, GeoLocation geoLocation) Return the Universal Coordinated Time (UTC) of the solar midnight for the end of the given civil day at the given location on earth (about 12 hours after solar noon).doublegetUTCNoon(Calendar calendar, GeoLocation geoLocation) Return the Universal Coordinated Time (UTC) of solar noon for the given day at the given location on earth.doublegetUTCSunrise(Calendar calendar, GeoLocation geoLocation, double zenith, boolean adjustForElevation) A method that calculates UTC sunrise as well as any time based on an angle above or below sunrise.doublegetUTCSunset(Calendar calendar, GeoLocation geoLocation, double zenith, boolean adjustForElevation) A method that calculates UTC sunset as well as any time based on an angle above or below sunset.Methods inherited from class com.kosherjava.zmanim.util.AstronomicalCalculator
adjustZenith, clone, getDefault, getEarthRadius, getElevationAdjustment, getRefraction, getSolarRadius, setEarthRadius, setRefraction, setSolarRadius
-
Field Details
-
JULIAN_DAY_JAN_1_2000
The Julian day of January 1, 2000, known as J2000.0.- See Also:
-
JULIAN_DAYS_PER_CENTURY
-
-
Constructor Details
-
NOAACalculator
public NOAACalculator()Default constructor of the NOAACalculator.
-
-
Method Details
-
getCalculatorName
Description copied from class:AstronomicalCalculatorReturns the name of the algorithm.- Specified by:
getCalculatorNamein classAstronomicalCalculator- Returns:
- the descriptive name of the algorithm.
- See Also:
-
getUTCSunrise
public double getUTCSunrise(Calendar calendar, GeoLocation geoLocation, double zenith, boolean adjustForElevation) Description copied from class:AstronomicalCalculatorA method that calculates UTC sunrise as well as any time based on an angle above or below sunrise. This abstract method is implemented by the classes that extend this class.- Specified by:
getUTCSunrisein classAstronomicalCalculator- Parameters:
calendar- Used to calculate day of year.geoLocation- The location information used for astronomical calculating sun times.zenith- the azimuth below the vertical zenith of 90 degrees. for sunrise typically thezenithused for the calculation uses geometric zenith of 90° andadjuststhis slightly to account for solar refraction and the sun's radius. Another example would beAstronomicalCalendar.getBeginNauticalTwilight()that passesAstronomicalCalendar.NAUTICAL_ZENITHto this method.adjustForElevation- Should the time be adjusted for elevation- Returns:
- The UTC time of sunrise in 24-hour format. 5:45:00 AM will return 5.75.0. If an error was encountered in
the calculation (expected behavior for some locations such as near the poles,
Double.NaNwill be returned. - See Also:
-
getUTCSunset
public double getUTCSunset(Calendar calendar, GeoLocation geoLocation, double zenith, boolean adjustForElevation) Description copied from class:AstronomicalCalculatorA method that calculates UTC sunset as well as any time based on an angle above or below sunset. This abstract method is implemented by the classes that extend this class.- Specified by:
getUTCSunsetin classAstronomicalCalculator- Parameters:
calendar- Used to calculate day of year.geoLocation- The location information used for astronomical calculating sun times.zenith- the azimuth below the vertical zenith of 90°. For sunset typically thezenithused for the calculation uses geometric zenith of 90° andadjuststhis slightly to account for solar refraction and the sun's radius. Another example would beAstronomicalCalendar.getEndNauticalTwilight()that passesAstronomicalCalendar.NAUTICAL_ZENITHto this method.adjustForElevation- Should the time be adjusted for elevation- Returns:
- The UTC time of sunset in 24-hour format. 5:45:00 AM will return 5.75.0. If an error was encountered in
the calculation (expected behavior for some locations such as near the poles,
Double.NaNwill be returned. - See Also:
-
getJulianDay
Return the Julian day from a Java Calendar.- Parameters:
calendar- The Java Calendar- Returns:
- the Julian day corresponding to the date Note: Number is returned for the start of the Julian day. Fractional days / time should be added later.
-
getJulianCenturiesFromJulianDay
Convert Julian day to centuries since J2000.0.- Parameters:
julianDay- the Julian Day to convert- Returns:
- the centuries since 2000 Julian corresponding to the Julian Day
-
getSunGeometricMeanLongitude
Returns the Geometric Mean Longitude of the Sun.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the Geometric Mean Longitude of the Sun in degrees
-
getSunGeometricMeanAnomaly
Returns the Geometric Mean Anomaly of the Sun in degrees.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the Geometric Mean Anomaly of the Sun in degrees
-
getEarthOrbitEccentricity
Return the unitless eccentricity of earth's orbit.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the unitless eccentricity
-
getSunEquationOfCenter
Returns the equation of center for the sun in degrees.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the equation of center for the sun in degrees
-
getSunTrueLongitude
Return the true longitude of the sun.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the sun's true longitude in degrees
-
getSunApparentLongitude
Return the apparent longitude of the sun.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- sun's apparent longitude in degrees
-
getMeanObliquityOfEcliptic
Returns the mean obliquity of the ecliptic (Axial tilt).- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the mean obliquity in degrees
-
getObliquityCorrection
Returns the corrected obliquity of the ecliptic (Axial tilt).- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the corrected obliquity in degrees
-
getSunDeclination
Return the declination of the sun.- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- the sun's declination in degrees
-
getEquationOfTime
Return the Equation of Time - the difference between true solar time and mean solar time- Parameters:
julianCenturies- the number of Julian centuries since J2000.0.- Returns:
- equation of time in minutes of time
-
getSunHourAngle
private static double getSunHourAngle(double latitude, double solarDeclination, double zenith, NOAACalculator.SolarEvent solarEvent) Return the hour angle of the sun in radians at for the latitude. -
getSolarElevation
Description copied from class:AstronomicalCalculatorReturn the Solar Elevation for the horizontal coordinate system at the given location at the given time. Can be negative if the sun is below the horizon. Not corrected for altitude.- Specified by:
getSolarElevationin classAstronomicalCalculator- Parameters:
calendar- time of calculationgeoLocation- The location information- Returns:
- solar elevation in degrees. The horizon (calculated in a vacuum using the solar radius as the point) is 090°, civil twilight is -690° etc. This means that sunrise and sunset that do use refraction and are calculated from the upper limb of the sun will return about 0.83390°.
- See Also:
-
getSolarAzimuth
Description copied from class:AstronomicalCalculatorReturn the Solar Azimuth for the horizontal coordinate system at the given location at the given time. Not corrected for altitude. True south is 180 degrees.- Specified by:
getSolarAzimuthin classAstronomicalCalculator- Parameters:
calendar- time of calculationgeoLocation- The location information- Returns:
- the solar azimuth in degrees. Astronomical midday would be 180 in the norther hemosphere and 0 in the southern hemosphere. Depending on the location and time of year, sunrise will have an azimuth of about 90° and sunset about 270°.
- See Also:
-
getSolarElevationAzimuth
private double getSolarElevationAzimuth(Calendar calendar, GeoLocation geoLocation, boolean isAzimuth) Return the Solar Elevation or Solar Azimuth at the given location and time. Can be negative if the sun is below the horizon. Elevation is based on sea-level and is not adjusted for altitude.- Parameters:
calendar- time of calculationgeoLocation- The location for calculating the elevation or azimuth.isAzimuth- true for azimuth, false for elevation- Returns:
- solar elevation or azimuth in degrees.
- See Also:
-
adjustHourForTimeZone
Returns the hour of day adjusted for the timezone and DST. This is needed for the azimuth and elevation calculations.- Parameters:
calendar- the Calendar to extract the hour from. This must have the timezone set to the proper timezone.- Returns:
- the adjusted hour corrected for timezone and DST offset.
-
getUTCNoon
Return the Universal Coordinated Time (UTC) of solar noon for the given day at the given location on earth. This implementation returns true solar noon as opposed to the time halfway between sunrise and sunset. Other calculators may return a more simplified calculation of halfway between sunrise and sunset. See The Definition of Chatzos for details on solar noon calculations.- Specified by:
getUTCNoonin classAstronomicalCalculator- Parameters:
calendar- The Calendar representing the date to calculate solar noon forgeoLocation- The location information used for astronomical calculating sun times. This class uses only requires the longitude for calculating noon since it is the same time anywhere along the longitude line.- Returns:
- the time in minutes from zero UTC
- See Also:
-
getUTCMidnight
Return the Universal Coordinated Time (UTC) of the solar midnight for the end of the given civil day at the given location on earth (about 12 hours after solar noon). This implementation returns true solar midnight as opposed to the time halfway between sunrise and sunset. Other calculators may return a more simplified calculation of halfway between sunrise and sunset. See The Definition of Chatzos for details on solar noon / midnight calculations.- Specified by:
getUTCMidnightin classAstronomicalCalculator- Parameters:
calendar- The Calendar representing the date to calculate solar noon forgeoLocation- The location information used for astronomical calculating sun times. This class uses only requires the longitude for calculating noon since it is the same time anywhere along the longitude line.- Returns:
- the time in minutes from zero UTC
- See Also:
-
getSolarNoonMidnightUTC
private static double getSolarNoonMidnightUTC(double julianDay, double longitude, NOAACalculator.SolarEvent solarEvent) Return the Universal Coordinated Time (UTC) of the current day solar noon or the the upcoming midnight (about 12 hours after solar noon) of the given day at the given location on earth. -
getSunRiseSetUTC
private static double getSunRiseSetUTC(Calendar calendar, double latitude, double longitude, double zenith, NOAACalculator.SolarEvent solarEvent) Return the Universal Coordinated Time (UTC) of sunrise or sunset in minutes for the given day at the given location on earth.- Parameters:
calendar- The calendarlatitude- The latitude of observer in degreeslongitude- Longitude of observer in degreeszenith- ZenithsolarEvent- If the calculation is forSUNRISEorSUNSET- Returns:
- the time in minutes from zero Universal Coordinated Time (UTC)
- TODO:
- Possibly increase the number of passes for improved accuracy, especially in the Arctic areas.
-