Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Data Juliana para Gregoriana


Predes

Pergunta

Bom dia, possuo uma função para converter data gregoriana para juliana q é a seguinte:

function Data_Juliana(Data_Atual: TDateTime): String;

var Ano, Mes, Dia: Word;

Data_Final, Data_Inicial: String;

Resultado: Real;

begin

DecodeDate (Date, Ano, Mes, Dia);

Data_Final := DateToStr (Data_Atual);

Data_Inicial := '31/12/' + IntToStr (Ano - 1);

Resultado := StrToDate (Data_Final) - StrToDate (Data_Inicial);

Result := FloatToStr (Resultado);

end;

A dúvida é: como faço o contrario? de juliana para gregoriana?

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
A dúvida é: como faço o contrario? de juliana para gregoriana?

Autor: Club Developers   -   Web del autor: www.clubdevelopers.com 

El domingo de Pascua corresponde al primer domingo que sigue a la primera luna llena de primavera.
La función aquí expuesta calcula el día de Pascua para fechas entre 1583 y 4099.

function Pascua(Ano : Integer): TDateTime;
var
  Y,G,C,X,Z,D,E,N,P,J,M: Integer;
begin
  { Algoritmo válido para fechas entre 1583 y 4099}
  Y := Ano;
  G := (Y mod 19) + 1;
  C := Trunc((Y/100)) + 1;
  X := Trunc(3 * C / 4) - 12;
  Z := Trunc(((8 * C) + 5) / 25) - 5;
  D := Trunc(((5 * Y) / 4) - X - 10);
  E := ((11 * G)+ 20 + Z - X) mod 30;
  if ((E = 25) and (G > 11)) or (E = 24) then
    E := E + 1;
  N := 44 - E;
  if N <; 21 then
    N := N + 30;
  P := N + 7 - ((D + N) mod 7);
  if P > 31 then
    J := P - 31
  else
    J := P;
  if J = P then
    M := 3
  else
    M := 4;
  Result := EncodeDate(Ano, M, J);
end;


Convertir una fecha gregoriana a juliana   01/01/2006 Top 

Autor: Club Developers   -   Web del autor: www.clubdevelopers.com 


Para convertir una fecha de formato gregoriano a juliano, simplemente tenemos que hacer una llamada a la función DateTimeToJulianDate() definida en DateUtils.


uses
  DateUtils;
var
  DiaJuliano: Extended;
  DateC: TDateTime;
  Ano, Mes, Dia: Word;
  Hora, Minuto, Segundo: Word;
begin
  DateC := EncodeDateTime(Ano, Mes, Dia, Hora, Minuto, segundo, 0);
  DiaJuliano := DateTimeToJulianDate(DateC);
end;


Atención: para que el resultado de la función DateTimeToJulianDate(date) de Delphi devuelva un valor correcto, es necesario que la fecha sea estrictamente más grande al 15/10/1582 00:00:00 (inicio del calendario gregoriano). Antes de esta fecha falta el desfase de 10 dias entre los dos calendarios. Para las fechas estrictamente inferiores al 5 de octubre 1582, simplemente hay que anãoadir 10 al resultado de la función de Delphi. Donde no se puede calcular los días julianos es entre las fechas del 5 al 14 de octubre 1582 debido a que éstas no existen.


Convertir una fecha juliana a gregoriana   01/01/2006 Top 

Autor: Club Developers   -   Web del autor: www.clubdevelopers.com 


Para convertir una fecha de formato juliano a formato gregoriano simplemente tenemos que hacer uso de la función JulianDateToDateTime() definida en DateUtils.

uses
  DateUtils;
var
  DiaJuliano: Extended;
  DateC: TDateTime;
begin
  DateC := JulianDateToDateTime(DiaJuliano);
end;


Saber los días de paso de horario de invierno a horario de verano   01/01/2006 Top 

Autor: Club Developers   -   Web del autor: www.clubdevelopers.com 


El paso de la hora de verano a la hora de invierno está fijado por ley hasta el 2006. El paso a la hora de verano se realiza el último domingo del mes de marzo y el paso a la hora de invierno el último domingo del mes de octubre.

Saber si un anãoo es bisiesto   01/01/2006 Top 

Autor: Club Developers   -   Web del autor: www.clubdevelopers.com 


Para que un anãoo sea bisiesto es necesario que sea múltiplo de 4 sin ser un múltiplo de 100 a excepción de si es múltiplo de 400. Los anãoos 1700, 1800 y 1900 no son bisiestos mientras que 2000 sí lo es.

Para este menester, Delphi nos ofrece la función IsInLeapYear declarada en la unit DateUtils.

uses
  DateUtils;
var
  MiDate: TDate;
begin
  MiDate := EncodeDate(2004,12,35);
  if IsInLeapYear(MiDate) then
    ShowMessage('Anãoo bisiesto')
  else
    ShowMessage('No es anãoo bisiesto');
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eu ande vendo sobre esse DateUtils e ao que parece ele pertence ao delphi 6, aqui estou utilizando o 5 tem algo parecido para delphi 5?

eu estava tentando fazer da segunite maneira:

DecodeDate (Date, Ano, Mes, Dia);

dataj:=(editjulian.text); //(recebe o valor Juliano inserido pelo usuário)

datafinal:='31/12/' + IntToStr (Ano - 1);

Resultado:=StrToDate(datafinal)+ StrToDate(dataj); ----> to com problema na hora de somar esses 2 valores

Result:=FloatToStr(resultado);

meconvert.text:=result;

Meu problema é na hora da soma dos valores porque o valor juliano não é uma data valida para ser um Date e a Data não é um valor valido pra integer

se conseguisse somar esses valores devolvendo uma data ##/##/## já resolveria!

Mais vlw pela atenção!

Link para o comentário
Compartilhar em outros sites

  • 0
Eu ande vendo sobre esse DateUtils e ao que parece ele pertence ao delphi 6, aqui estou utilizando o 5 tem algo parecido para delphi 5?

Predes ... fiz este código para o delphi 5, creio que vai ajudar a voce e a outros

CONVERTER DATA GREGORIANA PARA JULIANA E VICE VERSA

unit UJulianGreg;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Data : string;
  MesGreg, DiaGreg, AnoGreg : real;
implementation

{$R *.DFM}

Uses Math;

Procedure GtoJ(DiaGreg, MesGreg, AnoGreg : integer);
var A, B: integer; JulDate : real;
begin
   if (MesGreg <= 2) then
      begin
       MesGreg := MesGreg + 12;
       AnoGreg := AnoGreg - 1;
      end;

   A := Math.floor(AnoGreg/100);
   B := 2 - A + Math.floor(A/4);
   julDate := Math.floor(365.25*(AnoGreg+4716)) + Math.floor(30.6001*(MesGreg+1)) + DiaGreg + B - 1524.5;
   Data:= floattostr(julDate);
end;


Procedure JtoG(julDate : real);
var  Epsilon, omega , A, B, C, D, Z, f : real;
     MesGregText : string;
begin

  julDate := julDate + 0.5;
  z := Math.floor(julDate);
  f := julDate - z;
  if (z < 2299161) then
    A := z
  else
    omega := Math.floor((z-1867216.25)/36524.25);

  A := z + 1 + omega - Math.floor(omega/4);
  B := A + 1524;
  C := Math.floor((B-122.1)/365.25);
  D := Math.floor(365.25*C);
  Epsilon := Math.floor((B-D)/30.6001);
  DiaGreg := B - D - Math.floor(30.6001*Epsilon) + f;
  if (Epsilon < 14) then
     MesGreg := Epsilon - 1
  else
     MesGreg := Epsilon - 13;

  if (MesGreg > 2) then
     AnoGreg := C - 4716
  else
     AnoGreg := C - 4715;

  case trunc(MesGreg) of
   1  : MesGregText := 'Janeiro';
   2  : MesGregText := 'Fevereiro';
   3  : MesGregText := 'Março';
   4  : MesGregText := 'Abril';
   5  : MesGregText := 'Maio';
   6  : MesGregText := 'Junho';
   7  : MesGregText := 'Julho';
   8  : MesGregText := 'Agosto';
   9  : MesGregText := 'Setembro';
   10 : MesGregText := 'Outubro';
   11 : MesGregText := 'Novembro';
   12 : MesGregText := 'Dezembro';

  end;

end;
procedure TForm1.Button1Click(Sender: TObject);
var Year, Month, Day : Word;
begin
   // Data Gregoriana para Juliana
   // Dia , Mes , Ano
   Data:= InputBox('Data Gregoriana', 'Digite uma data', '00/00/0000');

   DecodeDate(strtodate(Data), Year, Month, Day);

   GtoJ(Day,Month,Year);
   Label1.caption := ('Data Juliana : ' + Data );
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   // Data Juliana para Gregoriana
   Data:= InputBox('Data Juliana', 'Digite uma data', '00000000,00');

   JtoG(strtofloat(Data));
   Label2.Caption := ('Data Gregoriana : ' + inttostr(trunc(DiaGreg)) + ' / ' + inttostr(trunc(MesGreg)) + ' / ' + inttostr(trunc(AnoGreg)));
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Caro Jhonas novamente agradeço pela atenção, seu código foi de grande ajuda em meu projeto, e referente ao erro no código que estava utilizando corrigi só pra constar hehehe...

quem tiver algo parecido não é completo como o do amigo Jhonas porém ta ai!

var

Ano, Mes, Dia: Word;

datafinal:string;

data:tdate;

dataj:integer;

dataj:=StrToInt(edit1.text);

datafinal:='31/12/'+IntToStr(Ano-1);

data:=StrToDate(datafinal);

MaskEdit1.text:=DateTostr(data+dataj);

Edit1.text:='';

Abraço!

Link para o comentário
Compartilhar em outros sites

  • 0
quem tiver algo parecido não é completo como o do amigo Jhonas porém ta ai!

Predes ... acho que voce deve rever este código, porque não é tão simples o calculo

Veja: se voce digitar esta data em juliano 2454831,50 voce teria que obter como resposta 31/12/2008

entretanto o seu código esta retornando 06/02/8730

Caso voce queira fazer uma prova, use este site para fazer um teste de datas

http://www.csgnetwork.com/juliangregcalconv.html

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Verdade por isso acabei utilizando seu codigo que é muito mais complexo e exato, mais acho q pra o que eu iria usar só receberia como data juliana de 1 a 365 talvez não tivesse problema onde o dia 31/12/08 equivale ao dia '00' , não sei, porem é melhor não arriscar até porque é meu primeiro projeto delphi e sql prefiro confiar em vocês que tem mtoo mais experiencia!

Editado por Predes
Link para o comentário
Compartilhar em outros sites

  • 0

Esqueci de colocar outra maneira de visualizar o resultado para mostrar o mes em texto

Label2.Caption := ('Data Gregoriana : ' + inttostr(trunc(DiaGreg)) + ' / ' + MesGregText + ' / ' + inttostr(trunc(AnoGreg)));

OBS: o dia juliano 0 correponde a 01/01/4712 A.C.

Se é um trabalho de escola, cuidado com as perguntas do professor ...rs

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...