juliandate.java

来自「Jive是基于JSP/JAVA技术构架的一个大型BBS论坛系统,这是Jive论坛」· Java 代码 · 共 287 行

JAVA
287
字号
/* * $RCSfile: JulianDate.java,v $ * $Revision: 1.1 $ * $Date: 2002/04/24 15:46:36 $ */package com.jivesoftware.forum.tool;import java.util.*;/** * An implementation of a class used represent a Julian date. One very important * thing to note about this class is that months ARE NOT zero based (unlike * the Java Date class). * * @author Matt Welsh (matt@matt-welsh.com) */public class JulianDate {	//----------------------------------------------------------------------------	// Static methods	//----------------------------------------------------------------------------	public static JulianDate getCurrentJD() {		return new JulianDate();	}	//----------------------------------------------------------------------------	// Constructors	//----------------------------------------------------------------------------	/**	 * Create a JD based on the current system time.	 */	public JulianDate() {		GregorianCalendar currentDate = new GregorianCalendar();		int currYear = currentDate.get(Calendar.YEAR);		int currMonth = currentDate.get(Calendar.MONTH) + 1;		int currDay = currentDate.get(Calendar.DAY_OF_MONTH);		int currHour = currentDate.get(Calendar.HOUR);		int currMin = currentDate.get(Calendar.MINUTE);		int currSec = currentDate.get(Calendar.SECOND);		jd = computeJD(currYear, currMonth, currDay, currHour, currMin, currSec);	}	/** 	 * Create a JD based on the given time.	 *	 * @param iYear The year to use	 * @param month The month to use (NOT ZERO BASED i.e. Jan = 1)	 * @param day The day to use	 */	public JulianDate(int iYear, int month, int day) {		this(iYear, month, day, 0, 0 ,0);	}	/**	 * Create a JD based on the given time.	 *	 * @param iYear The year to use	 * @param month The month to use (NOT ZERO BASED i.e. Jan = 1)	 * @param day The day to use	 * @param hour The hour to use	 * @param min The minute to use	 * @param sec The second to use	 */	public JulianDate(int iYear, int month, int day, int hour, int min, int sec) {		jd = computeJD(iYear, month, day, hour, min, sec);	}	/**	 * Create a JD based on the given time.	 *	 * @param jd The julian date as a double	 */	public JulianDate(double jd) {		this.jd = jd;		double j = jd;		gregorianDate = computeGregorianDate(j);		//et = computeET(j);		//paramU = computeParamU(et);	}	//----------------------------------------------------------------------------	// Public methods	//----------------------------------------------------------------------------	/**	 * Gets the julian date as a double.	 *	 * @return The julian date as a double.	 */	public double getJulianDate() {		return jd;	}	/**	 * Computes the number of Julian Centuries from 1900 Jan 0.5	 *	 * @return The number of Julian Centuries from 1900 Jan 0.5	 */	public double getJulianCentury () {		return ((jd - 2415020.0) / 36525.0);	}	/**	 * Returns the equivelent date on the Gregorian calendar.	 *	 * @return the equivelent date on the Gregorian calendar.	 */	public GregorianCalendar getGregorianDate() {		return gregorianDate;	}	/**	 * Returns the equivelent ephemeris time equivelent of this date. This is a	 * more stable time scale than UT and is useful for high precision	 * planetary computations.	 *	 * @return The ephemeris time representing this object.	 */	public double getEphemerisTime() {		return et;	}	/**	 * Gets the "U" parameter used in high precision planetary computations.	 *	 * @return The "U" parameter.	 */	public double getParamU() {		return paramU;	}	/**	 * Return this object as a String.	 *	 * @return A String object representing this object.	 */	public String toString() {		StringBuffer buffer = new StringBuffer();		buffer.append("JulianDate");		buffer.append("[");		buffer.append(String.valueOf(jd));		buffer.append(" ");		buffer.append(gregorianDate.get(GregorianCalendar.MONTH));		buffer.append("/");		buffer.append(gregorianDate.get(GregorianCalendar.DAY_OF_MONTH));		buffer.append("/");		buffer.append(gregorianDate.get(GregorianCalendar.YEAR));		buffer.append(" ");		buffer.append(gregorianDate.get(GregorianCalendar.HOUR));		buffer.append(":");		buffer.append(gregorianDate.get(GregorianCalendar.MINUTE));		buffer.append(":");		buffer.append(gregorianDate.get(GregorianCalendar.SECOND));		buffer.append(']');		return buffer.toString();	}	//----------------------------------------------------------------------------	// Private methods	//----------------------------------------------------------------------------	private double computeJD(int iYear, int month, int day,	                int hour, int min, int sec) {		int y;		int m;		int B;		double C;		if (month <= 2) {			y = iYear - 1;			m = month + 12;		}		else {			y = iYear;			m = month;		}		if (y < 0 ) {			C = -0.75;		}		else {			C = 0;		}		double D = ((double)hour / 24.0) + ((double)min / 1440.0) +			((double)sec / 86400.0);		if (day + 31L * (month + 12L * iYear) >= IGREG) {			int A= (int) (y / 100);			B= 2 - A + (int)(A / 4);		}		else B = 0;		double j = ((long)(365.25* y + C)) + ((long)(30.6001 * (m + 1))) +		          day + D + 1720994.5 + B;		gregorianDate = computeGregorianDate(j);		et = computeET(j);		paramU = computeParamU(et);		return j;	}	/**	 * Compute a gregorian calendar date based on the given JD	 */	public static GregorianCalendar computeGregorianDate (double jDate) throws IllegalArgumentException {		double A;		// Routine doesn't work for negative JDs		if (jDate<0) {			throw new IllegalArgumentException("Negative Julian Date in JulianDate::computeGregorianDate");		}		jDate += 0.5;		double integerPart = (long) jDate;             // Z = integerPart		double fractionalPart = jDate - (integerPart); // F= fractionalPart		if (integerPart >= 2299161.0) {			long Alpha= (long) ((integerPart - 1867216.25) / 36524.25);			A= integerPart + 1.0 + (double)Alpha;			A -= (long)((double)Alpha/4.0);		}		else A= integerPart;		double B= A + 1524.0;		long C= (long) ((B - 122.1) / 365.25);		long D= (long) (365.25 * (double)C);		long E= (long) (( B - (double)D) / 30.6001);		double dayWD = B - (double)D + fractionalPart;		dayWD -= (double) ((long)(30.6001 * (double)E)); // Day with decimals		int day= (int) dayWD;                          // day= INT only		dayWD -= (double) day;                         // Fractional part only		int month= (int)(E - 1);		if (month > 12) month -= 12;		int year= (int)(C - 4716);		if (month <= 2) ++(year);		if (year == 0) --(year);		dayWD *= 24.0;           // Convert decimal days to decimal hours		int hour = (int) dayWD;		dayWD -= (double)hour;   // Subtract hours leaving decimal minutes		dayWD *= 60.0;           // and then multiply by 60 for minutes		int min = (int)dayWD;		dayWD -= (double)min;    // Subtract Whole minutes leaving decimal secs		dayWD *= 60.0;           // and multiply by 60 for whole seconds		int sec = (int) dayWD;		return new GregorianCalendar(year, month - 1, day, hour, min, sec);	}	/**	 * Compute ephemeris time	 *	 * @param jDate the Julian date for which to compute ET	 */	private double computeET(double jDate) {		double d1 = 2378497.0;		double dt = (jDate - d1);		dt = dt / 36525.0;		dt = dt - 0.1;		dt = dt * dt;		dt = dt * 32.5;		dt = -15.0 + dt;		dt = dt / 86400.0;		double eTime = jDate + dt;		return eTime;	}	/**	 * Compute the time from J2000.0 in units of 10,000 julian years.	 *	 * @param eTime the ephemeris time of the date in question.	 */	private double computeParamU(double eTime) {		return (eTime - 2451545.0) / 3652500.0;	}	private long IGREG = (15 + 31L * (10 + 12L * 1582));	protected double jd;	protected GregorianCalendar gregorianDate;	protected double et;	protected double paramU;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?