Pascal/Turbo Pascal - Ayuda con fechas

 
Vista:

Ayuda con fechas

Publicado por Juan (83 intervenciones) el 22/08/2007 02:16:31
Hola que tal, en esta ocasión escribo porque tengo un problema que puede parecer muy estúpido pero bue, es fundamental saberlo dominar, pero en muchos trabajos veo que se usa mucho el tratamiento de fechas, mi problema es con el pase de formatos por ejemplo, cuando tengo un longint AAAAMMDD y tengo que pasarlo a DDMMAAAA o del estilo DD/MM/AAAA, o sino por ejemplo calcular la edad de una persona, se que tengo que hacer fecha actual menos la fecha de nacimiento, pero no se como aplicarlo al momento de hacer un programa, y tampoco se usar la funcion getdate, que se utiliza muchísimo según veo, me gustaría que me aclararan estas cosas, y muchas gracias, si pueden dar algunos ejemplos les agradecería.Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con fechas

Publicado por Diego Romero (996 intervenciones) el 22/08/2007 20:25:25
Bueno, primero agradezco tu pregunta porque me has hecho encontrarle un error grave a mi ahora antiguo cálculo de diferencia de fechas. Tenía un error muy grosero pero afortunadamente no afecta al funcionamiento general del sistema.

Para comenzar tenemos que reducir todo a la unidad que es el día. Entonces tendríamos que calcular cuántos días representan una fecha dada desde el inicio del calendario. Es decir que el día 1 es el 01/01/0001. Si podemos calcular los días transcurridos desde esa fecha hasta la fecha dada y luego hacemos la resta entre los dos obtendremos la cantidad de días de diferencia entre las dos fechas ¿cierto?, cierto.

Pero hay dos problemas. El primero son los años biciestos, el segundo es el agujero que hay entre el cambio del calendario juliano al gregoriano. Actualmente usamos el calendario gregoriano que incluye los años biciestos mientras que el juliano (en uso hasta el año 1582) no tenía años biciestos (todos los años eran de 364 días).

Después de darle vueltas al tema por horas decidí que lo mejor es convertir la fecha actual en calendario gregoriano al juliano, para sacarme de encima los años biciestos y luego compensar los días de más que tuvo el año 1582.

Y llegué a esta función.

function CalcJuliano(dia, mes, ano: integer): longint;
var
anospn, aux: real;
c : real;
begin
anospn:= 1.0 * ano;
aux:= (1.0 * mes - 2.85) / 12;
anospn:= anospn + aux;
if ((longint(ano) * 10000) + (mes * 100) + dia) <= 15821004 then
c:= 0.75 * 2
else
c:= 0.75 * trunc(anospn / 100);
CalcJuliano:= trunc(trunc(trunc(367 * anospn) - 1.75 * trunc(anospn) + dia) - c) + 1721115;
end;

Toma una fecha que debe ser válida, hace la traslación de la misma a días en el calendario juliano y devuelve la cantidad de días entre la fecha dada y el día 1 de ese calendario. No me pidas que explique paso a paso todos los cálculos, algunas constantes son el resultados de otros cálculos confiables que encontré en la red.

Habiendo convertido todo a cantidad de días "absolutos", ya no importa que la fecha dada sea en calendario gregoriano. El resto es convertir la otra fecha y calcular la diferencia:

type
TFecha=record
dia, mes, ano: integer;
end;
...
function RestarFecha(f1, f2: tfecha): longint;
begin
RestarFecha := CalcJuliano(f1.dia, f1.mes, f1.ano) - CalcJuliano(f2.dia,f2.mes,f2.ano);
end;

Lo que falta es obvio:

var
fecha1, fecha2: TFecha;

begin
fecha1.dia:=01;
fecha1.mes:=01;
fecha1.ano:=2006;

fecha2.dia:=01;
fecha2.mes:=01;
fecha2.ano:=2004;

writeln ('Diferencia en días: ', RestarFecha(fecha1, fecha2));
end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con fechas

Publicado por Juan (83 intervenciones) el 23/08/2007 17:54:08
me parecio muy bueno el aporte te agredezco, ahora lo que me faltaria saber es si tengo un entero AAAAMMDD como lo paso al formato AAAA/MM/DD o sino al formato DDMMAAAA ( sin usar strings, solo de tipo numérico), esas conversiones son las que no se hacer, te agredezco
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con fechas

Publicado por Diego Romero (996 intervenciones) el 23/08/2007 23:00:32
Bueno, primero tienes que estar seguro que el entero largo contiene este formato AAAAMMDD (que, a propósito, se llama fecha ISO). Pensaré en ello esta noche :P.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con fechas

Publicado por Diego Romero (996 intervenciones) el 24/08/2007 00:08:08
Lo tengo, es así:

uses crt;

type
TFecha=record
dia, mes, ano: integer;
end;

var
FechaCal: TFecha;

procedure FechaIsoToCal(FechaISO: longint; var Cal: TFecha);
begin
with Cal do
begin
ano:= fechaISO div 10000;
mes:= (fechaISO - (longint(ano)*10000)) div 100;
dia:= fechaISO - ((longint(ano)*10000) + (mes*100));
end;
end;

begin
FechaIsoToCal(20070823,FechaCal);
WriteLn('La fecha Calendario es: ',FechaCal.dia:2,'/',FechaCal.mes:2,'/',FechaCal.ano:4);
readkey;
end.

Enjoy ;).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con fechas

Publicado por juan (83 intervenciones) el 26/08/2007 03:07:44
Y por favor me podrás dar un ejemplo de get date?me sería muy útil, para sacar edades sobre todo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar