/* * [AutumnalEquinox.java] * * Summary: calculate when the autumnal equinox occurs. * * Copyright: (c) 1999-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 4.2 2008-12-03 add World AIDS day */ package com.mindprod.holidays; import com.mindprod.common18.BigDate; import static java.lang.System.*; // com.mindprod.holidays.AutumnalEquinox /** * calculate when the autumnal equinox occurs. * * @author Roedy Green, Canadian Mind Products * @version 4.2 2008-12-03 add World AIDS day * @since 1999 */ public final class AutumnalEquinox extends HolInfo { /** * test harness * * @param args not used */ public static void main( String[] args ) { if ( DEBUGGING ) { HolInfo h = new AutumnalEquinox(); BigDate d = new BigDate(); for ( int year = 1999; year <= 2012; year++ ) { d.setOrdinal( h.when( year, false ) ); out.println( d.getYYYY() + "-" + d.getMM() + "-" + d.getDD() ); } } } // end main /** * @inheritDoc */ public String getAuthority() { return "Jean Meeus\u2019s \"Astronomical Algorithms\""; } /** * @inheritDoc */ public int getFirstYear( int base ) { return -10000; } /** * @inheritDoc */ public String getName() { return "Autumnal Equinox"; } /** * @inheritDoc */ public String getRule() { return "September 20 to 23, based on earth\u2019s revolution around the sun.\n" + "Formulas we use are only valid 1000 .. 30000"; } /** * @inheritDoc */ public int when( int year, boolean shift, int base ) { if ( !isYearValid( year, base ) ) { return BigDate.NULL_ORDINAL; } if ( year < 1000 || year > 3000 ) { // our formula is not currently accurate outside this range. return BigDate.NULL_ORDINAL; } // Roughly each equinox is 365242.01767 days after the previous, // with some second, third and fourth order tweaking. // The base equinox is 2000-09-22. double m = ( ( double ) year - 2000 ) / 1000; // result ve is astronomical Proleptic Julian day number double ae = 2451810.21715 + 365242.01767 * m - 0.11575 * m * m + 0.00337 * m * m * m + 0.00078 * m * m * m * m; BigDate d = new BigDate( ae ); return shiftSatToFriSunToMon( d.getOrdinal(), shift ); } // end when }