waldo kitty wrote:

i think i might be able to do something with the JulianToDateTime once i get the base year portion converted to a true julian... i spotted some C# code while doing a bit of research earlier (see below)... it appears to convert the year to a julian year and then add the decimal day portion... this should then be a proper julian date which i should be able to handle ;)

Don't know whether any of this will help

If this is any use...

FUNCTION CalcJD(year, month, day: INTEGER): DOUBLE;

//***********************************************************************/
//* Name:    CalcJD                                                     */
//* Type:    Function                                                   */
//* Purpose: Julian day from calendar day                               */
//* Arguments:                                                          */
//*   year : 4 digit year                                               */
//*   month: January = 1                                                */
//*   day  : 1 - 31                                                     */
//* Return value:                                                       */
//*   The Julian day corresponding to the date                          */
//* Note:                                                               */
//*   Number is returned for start of day.  Fractional days should be   */
//*   added later.                                                      */
//***********************************************************************/

VAR     A, B: INTEGER;
        JD: DOUBLE;

BEGIN
  IF month <= 2 THEN BEGIN
    year -= 1;
    month += 12
  END;
  A:= Floor(year / 100);
  B:= 2 - A + Floor(A / 4);
JD:= Floor(365.25 * (year + 4716)) + Floor(30.6001 * (month + 1)) + day + B - 1524.5;
  RESULT:= JD
END { CalcJD } ;

That was derived from some calculations published by NOAA, it's actually sunrise/sunset times and I transcribed it from Javascript a few months ago and which appeared to test OK.

Also

FUNCTION jTime(t: Int64): DOUBLE;

// jtime - convert internal date and time to astronomical Julian
// time (i.e. Julian date plus day fraction)

BEGIN
  RESULT:= t;
RESULT:= (RESULT / 86400.0) + 2440587.5 // (seconds /(seconds per day)) + julian date of epoch
END { jTime } ;


FUNCTION jDayToSecs(jday: DOUBLE): Int64;

// jdaytosecs - convert Julian date to a UNIX epoch

BEGIN
RESULT:= Round((jday - 2440587.5) * 86400) // (juliandate - jdate of unix epoch)*(seconds per julian day)
END { jDayToSecs } ;


PROCEDURE jYear(td: DOUBLE; VAR yy, mm: Int64; VAR dd: DOUBLE);

// jyear - convert Julian date to year, month, day, which are
// returned via integer pointers to integers

VAR     z, a, alpha, b, c, d, e: Int64;
        f: DOUBLE;

BEGIN
  td:= td + 0.5;                       // astronomical to civil
  z:= Floor(td);
  f:= td - z;
  IF z < 2299161 THEN
    a:= z
  ELSE BEGIN
    alpha:= Floor((z - 1867216.25) / 36524.25);
    a:= z + 1 + alpha - Floor(alpha / 4)
  END;
  b:= a + 1524;
  c:= Floor((b - 122.1) / 365.25);
  d:= Floor(365.25 * c);
  e:= Floor((b - d) / 30.6001);

(* Note here: both MoonPhase.pm and moontool.c lose fractional days at this *) (* point since dd is declared as an integer; Perl programmers might not in *) (* fact notice this due to loose type handling. I think this is a bug since it *) (* prevents using non-GMT time ranges. MarkMLl. *)

  dd:= b - d - Floor(30.6001 * e) + f;
  IF e < 14 THEN
    mm:= e - 1
  ELSE
    mm:= e - 13;
  IF mm > 2 THEN
    yy:= c - 4716
  ELSE
    mm:= c - 4715
END { jYear } ;


PROCEDURE jYear(td: DOUBLE; VAR yy, mm, dd: Int64);

// jyear - convert Julian date to year, month, day, which are
// returned via integer pointers to integers

(* This is equivalent to the original jYear() which loses fractional days. *) (* MarkMLl. *)

VAR     y, m: Int64;
        d: DOUBLE;

BEGIN
  jYear(td, y, m, d);
  yy:= y;
  mm:= m;
  dd:= Trunc(d)
END { jYear } ;

which was transcribed from Perl (originally written in C) Moon phase calculations and again I believe tests OK.

--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to