当前位置: 技术问答>java相关
有谁知道在《java2核心技术》卷I中的光盘中的corejava包的Day类的两个关于日期算法???
来源: 互联网 发布时间:2015-04-06
本文导语: //Day类的源码为: package corejava; import java.util.*; import java.io.*; /** Stores dates and perform date arithmetic. This is another date class, but more convenient that java.util.Date or java.util.Calendar @version 1.20 5 Oc...
//Day类的源码为:
package corejava;
import java.util.*;
import java.io.*;
/**
Stores dates and perform date arithmetic.
This is another date class, but more convenient that
java.util.Date or java.util.Calendar
@version 1.20 5 Oct 1998
@author Cay Horstmann
*/
public class Day implements Cloneable, Serializable
{
/**
Constructs today's date
*/
public Day()
{
GregorianCalendar todaysDate = new GregorianCalendar();
year = todaysDate.get(Calendar.YEAR);
month = todaysDate.get(Calendar.MONTH) + 1;
day = todaysDate.get(Calendar.DAY_OF_MONTH);
}
/**
Constructs a specific date
@param yyyy year (full year, e.g., 1996,
not starting from 1900)
@param m month
@param d day
@exception IllegalArgumentException if yyyy m d not a
valid date
*/
public Day(int yyyy, int m, int d)
{
year = yyyy;
month = m;
day = d;
if (!isValid())
throw new IllegalArgumentException();
}
/**
Advances this day by n days. For example.
d.advance(30) adds thirdy days to d
@param n the number of days by which to change this
day (can be 0 if this day comes after b)
*/
public int daysBetween(Day b)
{
return toJulian() - b.toJulian();
}
/**
A string representation of the day
@return a string representation of the day
*/
public String toString()
{
return "Day[" + year + "," + month + "," + day + "]";
}
/**
Makes a bitwise copy of a Day object
@return a bitwise copy of a Day object
*/
public Object clone()
{
try
{
return super.clone();
}
catch (CloneNotSupportedException e)
{
// this shouldn't happen, since we are Cloneable
return null;
}
}
/**
Compares this Day against another object
@param obj another object
@return true if the other object is identical to this Day object
*/
public boolean equals(Object obj)
{
if (!getClass().equals(obj.getClass())) return false;
Day b = (Day)obj;
return day == b.day && month == b.month && year == b.year;
}
/**
Computes the number of days between two dates
@return true iff this is a valid date
*/
private boolean isValid()
{
Day t = new Day();
t.fromJulian(this.toJulian());
return t.day == day && t.month == month && t.year == year;
}
/**
@return The Julian day number that begins at noon of
this day
Positive year signifies A.D., negative year B.C.
Remember that the year after 1 B.C. was 1 A.D.
A convenient reference point is that May 23, 1968 noon
is Julian day 2440000.
Julian day 0 is a Monday.
This algorithm is from Press et al., Numerical Recipes
in C, 2nd ed., Cambridge University Press 1992
*/
private int toJulian()
{
int jy = year;
if (year 2)
{
jm++;
}
else
{
jy--;
jm += 13;
}
int jul = (int) (java.lang.Math.floor(365.25 * jy) + java.lang.Math.floor(30.6001*jm) + day + 1720995.0);
int IGREG = 15 + 31*(10+12*1582);
// Gregorian Calendar adopted Oct. 15, 1582
if (day + 31 * (month + 12 * year) >= IGREG)
// change over to Gregorian calendar
{
int ja = (int)(0.01 * jy);
jul += 2 - ja + (int)(0.25 * ja);
}
return jul;
}
/**
Converts a Julian day to a calendar date
This algorithm is from Press et al., Numerical Recipes
in C, 2nd ed., Cambridge University Press 1992
@param j the Julian date
*/
private void fromJulian(int j)
{
int ja = j;
int JGREG = 2299161;
/* the Julian date of the adoption of the Gregorian
calendar
*/
if (j >= JGREG)
/* cross-over to Gregorian Calendar produces this
correction
*/
{
int jalpha = (int)(((float)(j - 1867216) - 0.25) / 36524.25);
ja += 1 + jalpha - (int)(0.25 * jalpha);
}
int jb = ja + 1524;
int jc = (int)(6680.0 + ((float)(jb-2439870) - 122.1)/365.25);
int jd = (int)(365 * jc + (0.25 * jc));
int je = (int)((jb - jd)/30.6001);
day = jb - jd - (int)(30.6001 * je);
month = je - 1;
if (month > 12) month -= 12;
year = jc - 4715;
if (month > 2) --year;
if (year
package corejava;
import java.util.*;
import java.io.*;
/**
Stores dates and perform date arithmetic.
This is another date class, but more convenient that
java.util.Date or java.util.Calendar
@version 1.20 5 Oct 1998
@author Cay Horstmann
*/
public class Day implements Cloneable, Serializable
{
/**
Constructs today's date
*/
public Day()
{
GregorianCalendar todaysDate = new GregorianCalendar();
year = todaysDate.get(Calendar.YEAR);
month = todaysDate.get(Calendar.MONTH) + 1;
day = todaysDate.get(Calendar.DAY_OF_MONTH);
}
/**
Constructs a specific date
@param yyyy year (full year, e.g., 1996,
not starting from 1900)
@param m month
@param d day
@exception IllegalArgumentException if yyyy m d not a
valid date
*/
public Day(int yyyy, int m, int d)
{
year = yyyy;
month = m;
day = d;
if (!isValid())
throw new IllegalArgumentException();
}
/**
Advances this day by n days. For example.
d.advance(30) adds thirdy days to d
@param n the number of days by which to change this
day (can be 0 if this day comes after b)
*/
public int daysBetween(Day b)
{
return toJulian() - b.toJulian();
}
/**
A string representation of the day
@return a string representation of the day
*/
public String toString()
{
return "Day[" + year + "," + month + "," + day + "]";
}
/**
Makes a bitwise copy of a Day object
@return a bitwise copy of a Day object
*/
public Object clone()
{
try
{
return super.clone();
}
catch (CloneNotSupportedException e)
{
// this shouldn't happen, since we are Cloneable
return null;
}
}
/**
Compares this Day against another object
@param obj another object
@return true if the other object is identical to this Day object
*/
public boolean equals(Object obj)
{
if (!getClass().equals(obj.getClass())) return false;
Day b = (Day)obj;
return day == b.day && month == b.month && year == b.year;
}
/**
Computes the number of days between two dates
@return true iff this is a valid date
*/
private boolean isValid()
{
Day t = new Day();
t.fromJulian(this.toJulian());
return t.day == day && t.month == month && t.year == year;
}
/**
@return The Julian day number that begins at noon of
this day
Positive year signifies A.D., negative year B.C.
Remember that the year after 1 B.C. was 1 A.D.
A convenient reference point is that May 23, 1968 noon
is Julian day 2440000.
Julian day 0 is a Monday.
This algorithm is from Press et al., Numerical Recipes
in C, 2nd ed., Cambridge University Press 1992
*/
private int toJulian()
{
int jy = year;
if (year 2)
{
jm++;
}
else
{
jy--;
jm += 13;
}
int jul = (int) (java.lang.Math.floor(365.25 * jy) + java.lang.Math.floor(30.6001*jm) + day + 1720995.0);
int IGREG = 15 + 31*(10+12*1582);
// Gregorian Calendar adopted Oct. 15, 1582
if (day + 31 * (month + 12 * year) >= IGREG)
// change over to Gregorian calendar
{
int ja = (int)(0.01 * jy);
jul += 2 - ja + (int)(0.25 * ja);
}
return jul;
}
/**
Converts a Julian day to a calendar date
This algorithm is from Press et al., Numerical Recipes
in C, 2nd ed., Cambridge University Press 1992
@param j the Julian date
*/
private void fromJulian(int j)
{
int ja = j;
int JGREG = 2299161;
/* the Julian date of the adoption of the Gregorian
calendar
*/
if (j >= JGREG)
/* cross-over to Gregorian Calendar produces this
correction
*/
{
int jalpha = (int)(((float)(j - 1867216) - 0.25) / 36524.25);
ja += 1 + jalpha - (int)(0.25 * jalpha);
}
int jb = ja + 1524;
int jc = (int)(6680.0 + ((float)(jb-2439870) - 122.1)/365.25);
int jd = (int)(365 * jc + (0.25 * jc));
int je = (int)((jb - jd)/30.6001);
day = jb - jd - (int)(30.6001 * je);
month = je - 1;
if (month > 12) month -= 12;
year = jc - 4715;
if (month > 2) --year;
if (year