Skip to content

Commit 0649e12

Browse files
committed
refactoring of JulianDay
see issue #693
1 parent b0ed112 commit 0649e12

File tree

4 files changed

+73
-7
lines changed

4 files changed

+73
-7
lines changed

calendar/src/main/java/net/time4j/calendar/astro/JulianDay.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@
2222
package net.time4j.calendar.astro;
2323

2424
import net.time4j.Moment;
25+
import net.time4j.PlainTime;
26+
import net.time4j.engine.CalendarDate;
27+
import net.time4j.engine.EpochDays;
2528
import net.time4j.scale.TimeScale;
29+
import net.time4j.tz.ZonalOffset;
2630

2731
import java.io.IOException;
2832
import java.io.ObjectInputStream;
@@ -180,6 +184,47 @@ public static JulianDay ofEphemerisTime(Moment moment) {
180184

181185
}
182186

187+
/**
188+
* <p>Creates a Julian day on the time scale {@link TimeScale#TT},
189+
* sometimes also called <em>Julian Ephemeris Day</em>. </p>
190+
*
191+
* <p>This kind of Julian day represents the actual astronomical standard. The time
192+
* TT-2000-01-01T12:00Z corresponds to JD(TT)2451545.0 </p>
193+
*
194+
* @param date calendar date
195+
* @param time local time
196+
* @param offset timezone offset
197+
* @return JulianDay
198+
* @throws IllegalArgumentException if the Julian day of moment is not in supported range
199+
* @since 3.36/4.31
200+
*/
201+
/*[deutsch]
202+
* <p>Erzeugt einen julianischen Tag auf der Zeitskala {@link TimeScale#TT},
203+
* manchmal auch <em>Julian Ephemeris Day</em> genannt. </p>
204+
*
205+
* <p>Diese Art des julianischen Tages repr&auml;sentiert den aktuellen astronomischen Standard.
206+
* Die Zeit TT-2000-01-01T12:00Z entspricht JD(TT)2451545.0 </p>
207+
*
208+
* @param date calendar date
209+
* @param time local time
210+
* @param offset timezone offset
211+
* @return JulianDay
212+
* @throws IllegalArgumentException if the Julian day of moment is not in supported range
213+
* @since 3.36/4.31
214+
*/
215+
public static JulianDay ofEphemerisTime(
216+
CalendarDate date,
217+
PlainTime time,
218+
ZonalOffset offset
219+
) {
220+
221+
long d = EpochDays.JULIAN_DAY_NUMBER.transform(date.getDaysSinceEpochUTC(), EpochDays.UTC);
222+
double tod = time.get(PlainTime.NANO_OF_DAY) / (86400.0 * 1000000000L);
223+
double jde = d - 0.5 + tod - offset.getIntegralAmount() / 86400.0;
224+
return new JulianDay(jde, TimeScale.TT);
225+
226+
}
227+
183228
/**
184229
* <p>Creates a Julian day on the time scale {@link TimeScale#UT},
185230
* hence related to the mean solar time. </p>
@@ -332,7 +377,7 @@ public double getMJD() {
332377
* @return Julian century in J2000-frame
333378
* @since 3.36/4.31
334379
*/
335-
public double getCentury() {
380+
public double getCenturyJ2000() {
336381

337382
return (this.value - 2451545.0) / 36525;
338383

calendar/src/main/java/net/time4j/calendar/astro/MoonPhase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ public Moment atLunation(int n) {
331331
*/
332332
public static double getIllumination(Moment moment) {
333333

334-
double jct = JulianDay.ofEphemerisTime(moment).getCentury();
334+
double jct = JulianDay.ofEphemerisTime(moment).getCenturyJ2000();
335335

336336
// Meeus (47.2)
337337
double meanElongation =

calendar/src/test/java/net/time4j/calendar/astro/JulianDayTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import net.time4j.ClockUnit;
44
import net.time4j.Moment;
5+
import net.time4j.PlainDate;
6+
import net.time4j.PlainTime;
57
import net.time4j.PlainTimestamp;
8+
import net.time4j.engine.EpochDays;
69
import net.time4j.scale.TimeScale;
10+
import net.time4j.tz.OffsetSign;
11+
import net.time4j.tz.ZonalOffset;
712
import org.junit.Test;
813
import org.junit.runner.RunWith;
914
import org.junit.runners.JUnit4;
@@ -18,18 +23,29 @@
1823
public class JulianDayTest {
1924

2025
@Test
21-
public void ephemerisTime() {
26+
public void ephemerisTime1() {
2227
Moment j2000 = // TT = UTC + 42.184
2328
PlainTimestamp.of(2000, 1, 1, 11, 58, 56).minus(184, ClockUnit.MILLIS).atUTC();
2429
assertThat(j2000.toString(TimeScale.TT), is("TT-2000-01-01T12Z"));
2530
JulianDay expected = JulianDay.ofEphemerisTime(2451545.0);
2631
assertThat(JulianDay.ofEphemerisTime(j2000), is(expected));
2732
assertThat(expected.getMJD(), is(51544.5));
28-
assertThat(expected.getCentury(), is(0.0));
33+
assertThat(expected.getCenturyJ2000(), is(0.0));
2934
assertThat(expected.getScale(), is(TimeScale.TT));
3035
assertThat(expected.toMoment(), is(j2000));
3136
}
3237

38+
@Test
39+
public void ephemerisTime2() {
40+
PlainDate date = PlainDate.of(1992, 4, 12);
41+
PlainTime time = PlainTime.of(2);
42+
ZonalOffset utc = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 2);
43+
JulianDay jdEphemeris = JulianDay.ofEphemerisTime(date, time, utc);
44+
assertThat(
45+
jdEphemeris,
46+
is(JulianDay.ofEphemerisTime(date.get(EpochDays.JULIAN_DAY_NUMBER) - 0.5)));
47+
}
48+
3349
@Test
3450
public void meanSolarTime() {
3551
Moment j2000 = PlainTimestamp.of(2000, 1, 1, 12, 0).atUTC();

calendar/src/test/java/net/time4j/calendar/astro/MoonTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
import net.time4j.Moment;
44
import net.time4j.PlainDate;
5+
import net.time4j.PlainTime;
56
import net.time4j.PlainTimestamp;
6-
import net.time4j.engine.EpochDays;
7+
import net.time4j.tz.ZonalOffset;
78
import org.junit.Test;
89
import org.junit.runner.RunWith;
910
import org.junit.runners.JUnit4;
@@ -106,8 +107,12 @@ public void moonPhaseOfLastQuarterBefore() {
106107

107108
@Test
108109
public void illuminationOfMoon() {
109-
long d = PlainDate.of(1992, 4, 12).get(EpochDays.JULIAN_DAY_NUMBER);
110-
Moment m = JulianDay.ofEphemerisTime(d - 0.5).toMoment();
110+
Moment m =
111+
JulianDay.ofEphemerisTime(
112+
PlainDate.of(1992, 4, 12),
113+
PlainTime.midnightAtStartOfDay(),
114+
ZonalOffset.UTC
115+
).toMoment();
111116
assertThat(
112117
MoonPhase.getIllumination(m),
113118
is(0.68)); // Meeus (example 48.a)

0 commit comments

Comments
 (0)