[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orekit Users] Time question - julian date



beowulf zhang <beowulf.zhang@gmail.com> a écrit :

The absolute class not have the constructor:
AbsoluteDate t = new AbsoluteDate(DateComponents.JULIAN_EPOCH, my_jd, utc);

Ooops, sorry, it should read:

  AbsoluteDate t =
    new AbsoluteDate(DateComponents.JULIAN_EPOCH, utc).shiftedBy(my_mjd);


I use the code:

DateComponents dc = new DateComponents(DateComponents.JULIAN_EPOCH, 2456413);
TimeComponents tc = new TimeComponents(0.5*86400);
AbsoluteDate jdEpoch = new AbsoluteDate(dc, tc, utc);

but I get:

2013-04-30T12:00:00.000

not

01-May-2013 00:00:00

could you tell me the reason?

When you use both DateComponents and TimeComponents, the first parameter gives only a whole day number and the second the hour within this day starting from 00:00, not from 12:00. So your tc variable is really equivalent to TimeComponents.H12 (which is a predefined constant), not TimeComponents.H00.

The 00h versus 12h switch really depends on the epoch choice. For example the julian epoch and J2000 epoch both start at noon (TT scale), but the MJD epoch, the 1950 epoch (which is used by CNES for example) and the Java/Unix epoch all start at 00h. So we decided to have TimeComponents really represent a time from 00h.

This implies that new AbsoluteDate(DateComponents.JULIAN_EPOCH, ttScale)) is 12h BEFORE AbsoluteDate.JULIAN_EPOCH, but new AbsoluteDate(DateComponents.MODIFIED_JULIAN_EPOCH, ttScale)) is exactly at AbsoluteDate.MODIFIED_JULIAN_EPOCH. You can look at how the AbsoluteDate constants are defined from the DateComponents and TimeComponents constants here: <https://www.orekit.org/forge/projects/orekit/repository/revisions/master/entry/src/main/java/org/orekit/time/AbsoluteDate.java#L97>.

I agree this is weird, but all these epochs are weird.

What bothers me the most is that many operational systems represent time as a simple offset from a reference epoch by separately computing a day number n, then computing the time in the day by converting the UTC time to a number of seconds s, and finally compute n * 86400 + s, thus completely forgetting about the leap seconds that occurred between the reference epoch and the curent date. Using in the same instant definition UTC which is a discontinuous scale and an offset is really something to handle with great care.

So my advice would be to make really sure when you compute a date from an offset what is the meaning of the offset and in which time scale it is computed.

If you have the choice about external time representation, either sticking to date/time components if dealing with UTC or offsets if dealing with TT or TAI is probably the safest.

best regards,
Luc


2011/5/28, MAISONOBE Luc <luc.maisonobe@c-s.fr>:
Petrus Hyvönen <petrus.hyvonen@gmail.com> a écrit :

Hi,

Haven't managed to try that algorithm, but downloaded the SPG4 package
from
Vallado, and I get same Julian Date there as my previous algoritm.

If I create a own date reference on:
ad_jd = AbsoluteDate(-4712,01,01,12,00,00.000,utc)

and use;
epoch_date=AbsoluteDate(ad_jd,my_jd,utc)

I get conversions from julian date to .. time ... same as the Vallado
routines.

Why is orekit using a reference point at -4712-01-01T11:59:27.816 ? Is it
different timescales?

Yes, Orekit uses the TT time scale for this referene date.
In fact, julian day is mainly used only as a number of day reference,
and the time is added later, and can theoretically be expressed in
different time scales, mostly TT or UTC. This means that simply saying
a date is 2455709.29166667 is ambiguous, one should say in which time
scales the fractional part is considered.

As the other reference epoch are precisely defined in TT (J2000 is the
best example), and as TT is the most widely used time scale for
defining references in IAU recommendations, we have chosen in Orekit
to use the same TT time scale for all these references. This is
specified in the javadoc for J2000 (see
<https://www.orekit.org/static/apidocs/org/orekit/time/AbsoluteDate.html#J2000_EPOCH>)
but obviously it is not explained in the javadoc for JULIAN_EPOCH, my
bad.

We could perhaps provide two reference epoch, one JULIAN_EPOCH_TT and
one JULIAN_EPOCH_UTC, but this may also confuse users.

Another way to achieve what you want could be something like:

AbsoluteDate t = new AbsoluteDate(DateComponents.JULIAN_EPOCH, my_jd, utc);

Luc


Best regards
/Petrus



On Fri, May 20, 2011 at 5:53 PM, beowulf zhang
<beowulf.zhang@gmail.com>wrote:

This algorithm is in the JAT. link is http://jat.sourceforge.net/

2011/5/20, beowulf zhang <beowulf.zhang@gmail.com>:
> I can't find the reason of this question, but I give you a piece of
> program that could give correct answer.
>
>     /** Create a CalDate object using MJD. From Montenbruck C++ code.
>      * @param mjd Modified Julian Date.
>      */
>     public CalDate(double mjd){
>         long    a,b,c,d,e,f;
>         double  Hours,x;
>
>         // Convert Julian day number to calendar date
>         a = (long)(mjd+2400001.0);
>
>         if ( a < 2299161 ) {  // Julian calendar
>             b = 0;
>             c = a + 1524;
>         }
>         else {                // Gregorian calendar
>             b = (long)((a-1867216.25)/36524.25);
>             c = a +  b - (b/4) + 1525;
>         }
>
>         d     = (long)( (c-122.1)/365.25 );
>         e     = 365*d + d/4;
>         f     = (long)( (c-e)/30.6001 );
>
>         long temp = (long)(30.6001*f);
>         this.Day   = (int)(c - e - temp);
>         temp = (long)(f/14);
>         this.Month = (int)(f - 1 - 12*temp);
>         temp = (long)((7+Month)/10);
>         this.Year  = (int)(d - 4715 - temp);
>
>         Hours = 24.0*(mjd-Math.floor(mjd));
>
>         this.Hour = (int)Hours;
>         x = (Hours-Hour)*60.0;
>         this.Min = (int) x;
>         this.Sec = (x-Min)*60.0;
>         this.DOY = day2doy(this.Year, this.Month, this.Day);
>     }
>
>
> 2011/5/19, Petrus Hyvönen <petrus.hyvonen@gmail.com>:
>> Hi,
>>
>> This maybe is a FAQ but anyway...
>>
>> I'm trying to create an absolute date based on a julian date created
>> in
>> another software.
>>
>> My julian date is 2.456413500000000e+006, corresponding to 01-May-2013
>> 00:00:00 UTC according to that software and some web conversion i
checked
>> it
>> with.
>>
>> with orekit i do:
>> ad_jd = AbsoluteDate.JULIAN_EPOCH
>> ad_jd =
>> -4712-01-01T11:59:27.816
>>
>> AbsoluteDate(ad_jd,t*24*3600)
>> ans =
>> 2013-04-30T23:58:53.816
>>
>> There must be some kind of time scale or different references here I
>> suppose, how can convert this properly?
>>
>> Best regards
>> /Petrus
>>
>




--
_____________________________________________
Petrus Hyvönen, Uppsala, Sweden
Mobile Phone/SMS:+46 73 803 19 00




----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.








----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.