This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

Can someone please help.

I'm running a program where i'm converting dates to julian days.

When I run the formula in D3 i get the correct answer for today 199/01/06. When I rin it in D4 I get the wrong answer with the exact same formula. Why?

The prog is as follows:= D4 answer=805073198 D3 answer=2451185.

function date2julian(date:tdatetime):integer;

var y,m,d:word;

jd:integer;

begin

decodeDate(date,y,m,d);

jd:= ( 1461 * ( y + 4800 + ( m - 14 ) div 12 ) ) div 4 +

( 367 * ( m - 2 - 12 * ( ( m - 14 ) div 12 ) ) ) div 12 -

( 3 * ( ( y + 4900 + ( m - 14 ) div 12 ) div 100 ) ) div 4 +

d - 32075;

date2julian:=jd;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

edit1.text:=inttostr(date2julian(now));

end;

I'm running a program where i'm converting dates to julian days.

When I run the formula in D3 i get the correct answer for today 199/01/06. When I rin it in D4 I get the wrong answer with the exact same formula. Why?

The prog is as follows:= D4 answer=805073198 D3 answer=2451185.

function date2julian(date:tdatetime

var y,m,d:word;

jd:integer;

begin

decodeDate(date,y,m,d);

jd:= ( 1461 * ( y + 4800 + ( m - 14 ) div 12 ) ) div 4 +

( 367 * ( m - 2 - 12 * ( ( m - 14 ) div 12 ) ) ) div 12 -

( 3 * ( ( y + 4900 + ( m - 14 ) div 12 ) div 100 ) ) div 4 +

d - 32075;

date2julian:=jd;

end;

procedure TForm1.Button1Click(Sender

begin

edit1.text:=inttostr(date2

end;

It's very strange. I tried converting to real still no success. Could it meybe be the fact that I'm using NT and not 95.

result was 2451185 on both

did you know on the Delphi Super Page (http://sunsite.icm.edu.pl/delphi/) there is a JDATE component that gives Julian dates,week numbers, etc and it's free .

maybe worth a try

Regards Barry

(1) Check if "(m-14) div 12" is the same for Delphi3/4.

(2) Check if "(y+4900+(m-14) div 12)" is the same...

(3) and so on...

There must be a difference somewhere, but don't ask me where...

Regards, Madshi.

Do you mean "1999/01/06" ?

It is possible that you are testing using a date for which the Julian day number is actually negative, and D4 is using a larger word size than D3, or something like that.

Can you define Julian date for me? I believe it's a count of days from a reference date, but what's the reference date?

Also, since TDateTime is merely a fractional count of days from a reference date, can't you just cast to integer and compensate any difference between the Julian reference date and the Windows reference date?

I checked the complete formula line by line.

Line1 converts the year to days. Line2 Month to days. Line3 leaves the days.

When I assosiate a variable to each line the error comes up in the first line "the year".

Wamoz

The reference date for Julian is -4713/11/24 which will return 0. What I've decided to do is use your suggestion and add the difference between Julian and TDateTime refence to TdateTime. However, what's worrying is why I get incorrect answer in D4 - will this error affect any other formulas.

Thanks for the help.

Regards Steve

jd:= ( 1461 * ( y + 4800 + ( m - 14 ) div 12 ) ) div 4;

jd is integer, so it can hold a value up to 2147483647.

y,m are word, so they can only hold a value up to 65535.

But if you calculate (y+4800)*1461, you'll get the value 9933339. So what does Delphi do with these value? Does Delphi shorten it to word size? Or does Delphi convert the whole calculation to integer size? I am not sure which way is the way it has to be?

If you want the calculation to be restricted to word size you should write "((blabla*blabla) and $FFFF)". If you want the calculation to run with integer you should do something like this: "1461 * (integer(y)+4800)".

I don't know why the result of the calculation differs at your computer from Delphi3 to Delphi4 and why it does not differ at my computer. Perhaps there's a hidden compiler parameter somewhere. However, if you are careful with the types, everything should be fine...

Regards, Madshi.

I have now amended my function as per below; If I substitute the A1 part of the formula with (m-14) I get the wrong answer but when I calculate this part firs I don't have any problems. Could the reason possible be the number of indented brackets that D4 can handle. (I installed D4 on another PC minimum install and had the same problems).

Thanks for all you comments.

Regards Steve

function date2julian(date:tdatetime

var y,m,d:word;

jd,YD,MD,DD,e,a1:integer;

begin

decodeDate(date,y,m,d);

a1:=m-14;

YD:= ((1461*(y+4800+((a1) div 12))) div 4);

MD:= ((367*(m-2-12*((a1) div 12))) div 12);

DD:= ((3*((y+4900+((a1) div 12)) div 100)) div 4);

e:= (d - 32075);

jd:=YD+MD-DD+e;

date2julian:=jd;

end;

Hmm. Have you installed UpdatePack #2? Perhaps this is the difference between our Delphi4 tests?

Regards, Madshi.

You hit the nail on the head. I'd downloaded the update but never installed it.

All is now well.

Thank a lot.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.

Regards, Madshi.