mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-16 18:25:57 +00:00
ICU-1325 add USNO reference data to check sunrise and sunset times; add basic computation test
X-SVN-Rev: 10876
This commit is contained in:
parent
c9cd0500a9
commit
e5d724909c
1 changed files with 132 additions and 10 deletions
|
@ -5,8 +5,8 @@
|
|||
*******************************************************************************
|
||||
*
|
||||
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/calendar/AstroTest.java,v $
|
||||
* $Date: 2002/10/24 19:31:46 $
|
||||
* $Revision: 1.8 $
|
||||
* $Date: 2003/01/20 20:02:45 $
|
||||
* $Revision: 1.9 $
|
||||
*
|
||||
*****************************************************************************************
|
||||
*/
|
||||
|
@ -121,35 +121,157 @@ public class AstroTest extends TestFmwk {
|
|||
}
|
||||
}
|
||||
|
||||
static final long DAY_MS = 24*60*60*1000L;
|
||||
|
||||
public void TestSunriseTimes() {
|
||||
// logln("Sunrise/Sunset times for San Jose, California, USA");
|
||||
// CalendarAstronomer astro = new CalendarAstronomer(-121.55, 37.20);
|
||||
// TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
|
||||
|
||||
// We'll use a table generated by the UNSO website as our reference
|
||||
// From: http://aa.usno.navy.mil/
|
||||
//-Location: W079 25, N43 40
|
||||
//-Rise and Set for the Sun for 2001
|
||||
//-Zone: 4h West of Greenwich
|
||||
int[] USNO = {
|
||||
6,59, 19,45,
|
||||
6,57, 19,46,
|
||||
6,56, 19,47,
|
||||
6,54, 19,48,
|
||||
6,52, 19,49,
|
||||
6,50, 19,51,
|
||||
6,48, 19,52,
|
||||
6,47, 19,53,
|
||||
6,45, 19,54,
|
||||
6,43, 19,55,
|
||||
6,42, 19,57,
|
||||
6,40, 19,58,
|
||||
6,38, 19,59,
|
||||
6,36, 20, 0,
|
||||
6,35, 20, 1,
|
||||
6,33, 20, 3,
|
||||
6,31, 20, 4,
|
||||
6,30, 20, 5,
|
||||
6,28, 20, 6,
|
||||
6,27, 20, 7,
|
||||
6,25, 20, 8,
|
||||
6,23, 20,10,
|
||||
6,22, 20,11,
|
||||
6,20, 20,12,
|
||||
6,19, 20,13,
|
||||
6,17, 20,14,
|
||||
6,16, 20,16,
|
||||
6,14, 20,17,
|
||||
6,13, 20,18,
|
||||
6,11, 20,19,
|
||||
};
|
||||
|
||||
logln("Sunrise/Sunset times for Toronto, Canada");
|
||||
CalendarAstronomer astro = new CalendarAstronomer(-79.38, 43.65);
|
||||
TimeZone tz = TimeZone.getTimeZone("America/Detroit");
|
||||
CalendarAstronomer astro = new CalendarAstronomer(-(79+25/60), 43+40/60);
|
||||
TimeZone tz = TimeZone.getTimeZone("America/Montreal");
|
||||
|
||||
GregorianCalendar cal = new GregorianCalendar(tz, Locale.US);
|
||||
GregorianCalendar cal2 = new GregorianCalendar(tz, Locale.US);
|
||||
cal.set(cal.YEAR, 2001);
|
||||
cal.set(cal.MONTH, cal.APRIL);
|
||||
cal.set(cal.DAY_OF_MONTH, 1);
|
||||
|
||||
DateFormat df = DateFormat.getTimeInstance(cal, DateFormat.MEDIUM, Locale.US);
|
||||
DateFormat df2 = DateFormat.getDateTimeInstance(cal, DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.US);
|
||||
DateFormat day = DateFormat.getDateInstance(cal, DateFormat.MEDIUM, Locale.US);
|
||||
|
||||
|
||||
|
||||
for (int i=0; i < 30; i++) {
|
||||
astro.setDate(cal.getTime());
|
||||
|
||||
Date sunrise = new Date(astro.getSunRiseSet(true));
|
||||
Date sunset = new Date(astro.getSunRiseSet(false));
|
||||
|
||||
logln("Date: " + day.format(cal.getTime()) +
|
||||
", Sunrise: " + df.format(sunrise) +
|
||||
", Sunset: " + df.format(sunset));
|
||||
|
||||
cal2.setTime(cal.getTime());
|
||||
cal2.set(Calendar.SECOND, 0);
|
||||
cal2.set(Calendar.MILLISECOND, 0);
|
||||
|
||||
cal2.set(Calendar.HOUR_OF_DAY, USNO[4*i+0]);
|
||||
cal2.set(Calendar.MINUTE, USNO[4*i+1]);
|
||||
Date exprise = cal2.getTime();
|
||||
cal2.set(Calendar.HOUR_OF_DAY, USNO[4*i+2]);
|
||||
cal2.set(Calendar.MINUTE, USNO[4*i+3]);
|
||||
Date expset = cal2.getTime();
|
||||
// Compute delta of what we got to the USNO data, in seconds
|
||||
int deltarise = Math.abs((int)(sunrise.getTime() - exprise.getTime()) / 1000);
|
||||
int deltaset = Math.abs((int)(sunset.getTime() - expset.getTime()) / 1000);
|
||||
|
||||
// Allow a deviation of 0..MAX_DEV seconds
|
||||
// It would be nice to get down to 60 seconds, but at this
|
||||
// point that appears to be impossible without a redo of the
|
||||
// algorithm using something more advanced than Duffett-Smith.
|
||||
final int MAX_DEV = 180;
|
||||
if (deltarise > MAX_DEV || deltaset > MAX_DEV) {
|
||||
if (deltarise > MAX_DEV) {
|
||||
errln("FAIL: " + day.format(cal.getTime()) +
|
||||
", Sunrise: " + df2.format(sunrise) +
|
||||
" (USNO " + df.format(exprise) +
|
||||
" d=" + deltarise + "s)");
|
||||
} else {
|
||||
logln(day.format(cal.getTime()) +
|
||||
", Sunrise: " + df.format(sunrise) +
|
||||
" (USNO " + df.format(exprise) + ")");
|
||||
}
|
||||
if (deltaset > MAX_DEV) {
|
||||
errln("FAIL: " + day.format(cal.getTime()) +
|
||||
", Sunset: " + df2.format(sunset) +
|
||||
" (USNO " + df.format(expset) +
|
||||
" d=" + deltaset + "s)");
|
||||
} else {
|
||||
logln(day.format(cal.getTime()) +
|
||||
", Sunset: " + df.format(sunset) +
|
||||
" (USNO " + df.format(expset) + ")");
|
||||
}
|
||||
} else {
|
||||
logln(day.format(cal.getTime()) +
|
||||
", Sunrise: " + df.format(sunrise) +
|
||||
" (USNO " + df.format(exprise) + ")" +
|
||||
", Sunset: " + df.format(sunset) +
|
||||
" (USNO " + df.format(expset) + ")");
|
||||
}
|
||||
cal.add(Calendar.DATE, 1);
|
||||
}
|
||||
|
||||
// CalendarAstronomer a = new CalendarAstronomer(-(71+5/60), 42+37/60);
|
||||
// cal.clear();
|
||||
// cal.set(cal.YEAR, 1986);
|
||||
// cal.set(cal.MONTH, cal.MARCH);
|
||||
// cal.set(cal.DATE, 10);
|
||||
// cal.set(cal.YEAR, 1988);
|
||||
// cal.set(cal.MONTH, cal.JULY);
|
||||
// cal.set(cal.DATE, 27);
|
||||
// a.setDate(cal.getTime());
|
||||
// long r = a.getSunRiseSet2(true);
|
||||
}
|
||||
|
||||
public void TestBasics() {
|
||||
// Check that our JD computation is the same as the book's (p. 88)
|
||||
GregorianCalendar cal3 = new GregorianCalendar(TimeZone.getTimeZone("GMT"), Locale.US);
|
||||
DateFormat d3 = DateFormat.getDateTimeInstance(cal3, DateFormat.MEDIUM,DateFormat.MEDIUM,Locale.US);
|
||||
cal3.clear();
|
||||
cal3.set(cal3.YEAR, 1980);
|
||||
cal3.set(cal3.MONTH, Calendar.JULY);
|
||||
cal3.set(cal3.DATE, 27);
|
||||
astro.setDate(cal3.getTime());
|
||||
double jd = astro.getJulianDay() - 2447891.5;
|
||||
double exp = -3444;
|
||||
if (jd == exp) {
|
||||
logln(d3.format(cal3.getTime()) + " => " + jd);
|
||||
} else {
|
||||
errln("FAIL: " + d3.format(cal3.getTime()) + " => " + jd +
|
||||
", expected " + exp);
|
||||
}
|
||||
|
||||
// cal3.clear();
|
||||
// cal3.set(cal3.YEAR, 1990);
|
||||
// cal3.set(cal3.MONTH, Calendar.JANUARY);
|
||||
// cal3.set(cal3.DATE, 1);
|
||||
// cal3.add(cal3.DATE, -1);
|
||||
// astro.setDate(cal3.getTime());
|
||||
// astro.foo();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue