Seite 1 von 1

Formel für Datum -> mjd gesucht

Verfasst: Do 13. Jul 2006, 12:55
von Erdnussnase
Hat jemand eine Formel bzw. ein Stückchen Code wie ich von einem gegeben Datum auf die Topf eigene mjd Darstellung komme ?
Würde mir das Leben unter der IDE erleichtern.

Verfasst: Do 13. Jul 2006, 13:10
von Jetson
Was spricht dagegen TAP_MakeMjd() zu benutzen? (API-Doku S.19)

Verfasst: Do 13. Jul 2006, 13:24
von Erdnussnase
Das ich das nicht auf dem Topf brauche, sondern unter IDE (Windoof).

Verfasst: Do 13. Jul 2006, 13:36
von Miq
Wie sind denn die Formate vorher/nachher? Ich hätte da ein paar Minuten frei :D

Verfasst: Do 13. Jul 2006, 13:41
von ibbi
Hier sollte es die gewünschten Algorithmen geben.

Verfasst: Do 13. Jul 2006, 13:48
von jkIT
Versuch mal das, ist Pascal, aber bestimmt nicht schwehr in eine andere Programmiersprache zu übesetzen.

Code: Alles auswählen

type
  TTFdatetime = packed record
    swMJD : WORD;
    hour  : Byte;
    min   : Byte;
  end;

function convert_date_time(year, month, day, hour, minute :integer; var date : TTFdatetime): boolean;
// EN 300 468 Annex C - Conversion between time and date conventions
// from www.ETSI.ch
const
  month_to_days : array[1..13] of integer = (0,31,59,90,120,151,181,212,243,273,304,334,365);
var
  day_in_year : integer;
  iMJD : integer;
  y, m, d, hr, min : integer;
begin
  day_in_year := day + month_to_days[month];
  if ((month > 2) and (year mod 4 = 0) and ((year mod 100 <> 0) or (year mod 400 = 0))) then
    inc(day_in_year);
  iMJD := (year - 1901) * 365 + ((year - 1901) div 4) -
         ((year - 1901) div 100) + ((year - 1601) div 400) +
         day_in_year + 15384;
  date.swMJD := swapWord(word(iMJD)); // change Endian for PowerPC and Mips
  date.hour := hour;
  date.min := minute;
  // check_date_time
  result := convert_date_time(date, y, m, d, hr, min) and
            (y = year) and
            (m = month) and
            (d = day);
end;

Verfasst: Do 13. Jul 2006, 14:08
von Aldarin
oder die tfdll.dll Funktionen verwenden:

Code: Alles auswählen

extern "C" __declspec(dllimport) byte	ExtractMjd(word mjd, word *year, byte *month, byte *day, byte *weekDay);
extern "C" __declspec(dllimport) word	MakeMjd(word year, byte month, byte day);
Gruß
Aldarin

Verfasst: Do 13. Jul 2006, 19:49
von Harvey
An der Pascal-Routine stimmt was nicht (oder ich kann nicht Rechnen).

Für den 12.11.2006 soll 54051 rauskommen, ich errechne aber 54084.

Topfield hat's so implementiert (etliche maschinencodes zusammengefasst):

Code: Alles auswählen

if (Month==1 || Month==2) S4=1 else s4=0;

t9 = Year - s4;
t9 = t9 * 36525;
t9 = t9 + 36525 - 1901*36525;
t9 = t9 / 100 + Day;

t7 = s4 * 12 + Month + 1;
t7 = (t7 * 306001) / 10000;
return t9 + t7 + 14956;

Verfasst: Fr 14. Jul 2006, 14:55
von Erdnussnase
Besten Dank,

Da kann ich mir ja jetzt das beste raussuchen :rolleyes:

Verfasst: Fr 14. Jul 2006, 16:03
von jkIT
Harvey hat geschrieben:An der Pascal-Routine stimmt was nicht (oder ich kann nicht Rechnen :wink: ).
Für den 12.11.2006 soll 54051 rauskommen, ich errechne aber 54084
Da hast Du Dich tatsächlich verrechnet, da kommt schon 54051 raus.

Verfasst: Fr 14. Jul 2006, 16:23
von Harvey
Ich habe übersehen, dass das Array bei 1 anfängt :oops: