![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Я новичок, попробывал написать фун-цию вычисления Юлианской даты, но она ни в какую не хочет работать подскажите где ошибка.
Код:
function TForm1.JDday(Year, Month, Day: real): real; begin JDday:=INT(365.25(Year + 4716)) + INT(30.6001(Month + 1)) + Day - 1524.5; if Month>2 then begin Year:=Year; Month:=Month; end else if (Month=1) or (Month=2) then begin Year:=Year-1; Month:=Month+12; end; end; end. |
#2
|
||||
|
||||
![]() Сначала должны идти проверки (if), а потом пересчёт дат (JD = ).
Код:
365.25(Year + 4716) Код:
if Month>2 then begin Year:=Year; Month:=Month; end else if (Month=1) or (Month=2) then begin Year:=Year-1; Month:=Month+12; end; А здесь логику нужно сделать наоборот (инвертировать), чтоб не писать первую часть кода: Код:
if (Month=1) or (Month=2) then begin Year:=Year-1; Month:=Month+12; end; Но этот кусок, должен быть перед пересчётом JDDay Последний раз редактировалось Uniq!, 10.09.2013 в 20:07. |
#3
|
||||
|
||||
![]() Лень читать про "юлианскую дату" и формулы расчета, но могу сказать как минимум две вещи.
1) Цитата:
2) Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 10.09.2013 в 20:06. |
#4
|
|||
|
|||
![]() Цитата:
![]() |
#5
|
|||
|
|||
![]() После беглого прочтения про юлианскую дату и её расчёт, я так понимаю что должно быть что-то типа такого:
Код:
unit uMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } function JDday(const year, month, day:integer):integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin memo1.Lines.Add(IntToStr(JDday(2013, 9,12))); end; function TForm1.JDday(const year, month, day: integer): integer; var a, y, m:integer; begin a:= trunc((14 - month) / 12); y:= year + 4800 - a; m:= month + 12 * a - 3; result := day + trunc((153 * m + 2) / 5) + trunc(365 * y) + trunc(y / 4) - trunc(y / 100) + trunc(y / 400) - 32045; end; end. |
#6
|
|||
|
|||
![]() Для вычесления Юлианской даты есть формула.
JD=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1 - 1524.5 а также некоторое условие .Если month=1 или Month=2 тогда следует принять Year=Year-1 Month=Month+12. Учитывая ваши высказывания написал теперь процедуру Код:
Procedure JDday(Year1, Month1:integer; Day1:real); begin if (month1=1) or ( Month1=2) then begin Year1:=Year1-1; Month1:=Month1+12; JDday:=INT*(365.25*(Year1 + 4716)) + INT*(30.6001*(Month1 + 1)) + Day1 - 1524.5; end; Но при попытки скомпилировать и вывести в лейбл результат выдаёт ошибку [dcc32 Error] Unit1.pas(55): E2010 Incompatible types: 'Real' and 'procedure, untyped pointer or untyped parameter'. В капчу вывожу через FloatToStr |
#7
|
|||
|
|||
![]() Цитата:
|
#8
|
|||
|
|||
![]() Цитата:
Код:
function TForm1.jd(year, month, day: real): real; begin if (month=1) or ( month=2) then begin Year:=Year-1; Month:=Month+12; end; result:=INT(365.25*(Year + 4716)) + INT(30.6001*(Month + 1)) + Day - 1524.5; end; |
#9
|
|||
|
|||
![]() Спасибо Annihilator за помощь. Всё работает на ура! Нашёл другую формулу. теперь всё работает как надо!
Код:
function TForm1.JD(year, month, day: real): real; begin if (month=1) or ( month=2) then begin Year:=Year-1; Month:=Month+12; end; result:=INT(365.25*Year)+ INT(30.6001*(Month + 1)) -15+1720996.5+ Day; end; |
#10
|
|||
|
|||
![]() Цитата:
![]() |