Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-03-2007
JM75 JM75 is offline
Miembro
 
Registrado: sep 2006
Posts: 25
Poder: 0
JM75 Va por buen camino
Saber si un año es bisiesto

Hola a todos. En la aplicación que estoy desarrollando necesito saber si un año es bisiesto o no según la fecha que se introduzca. ¿Hay alguna forma de calcularlo?

Gracias.
Responder Con Cita
  #2  
Antiguo 20-03-2007
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola,

aquí tienes una manera sencilla:

Código Delphi [-]
Function EsBisiesto(Anyo: string) : Boolean;
var FecAux : tDateTime;
begin
     try
        FecAux := StrToDate('29/02/'+Anyo);
        Result := True;
     except
        Result := False;
     end;
end;

Espero te sirva.

Saludos
Responder Con Cita
  #3  
Antiguo 20-03-2007
JM75 JM75 is offline
Miembro
 
Registrado: sep 2006
Posts: 25
Poder: 0
JM75 Va por buen camino
Hola Bicho,
la función que me has pasado funciona. Aunque si la fecha no existe te da un mensaje de error y después continua bien. ¿Hay alguna forma de que no salte el mensaje de error?
Gracias
Responder Con Cita
  #4  
Antiguo 20-03-2007
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola,

¿has copiado el try.. except? Si no es así ponlo para capturar el error y evitar que te salga.
Si lo has puesto y aún así te salta un error (te lo debe estar dando si lo ejecutas desde Delphi, ¿no?) debes desactivar los errores del debuger:
Menú Tools => Debugger Options => Pestaña Language Exceptions => Desmarcar: Stop On Delphi Exceptions.

Saludos
Responder Con Cita
  #5  
Antiguo 20-03-2007
JM75 JM75 is offline
Miembro
 
Registrado: sep 2006
Posts: 25
Poder: 0
JM75 Va por buen camino
Al desactivar la opción que has dicho ya no sale más.

Gracias por todo.
Responder Con Cita
  #6  
Antiguo 20-03-2007
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Creo que esta función es todavía más sencilla, te la brinda la unidad de Delphi SysUtils:
Código Delphi [-]
function IsLeapYear(Year: Word): Boolean;

Saludos!!!
Responder Con Cita
  #7  
Antiguo 20-03-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
Sólo como curiosidad, los años bisiestos son todos los divisibles entre 4, excepto los que sean divisibles entre 100 y no entre 400. Algo así:

Código Delphi [-]
function bisiesto(year : word): boolean;
begin
  Result := (year mod 4 = 0) and ((year mod 100 <> 0) or (year mod 400 = 0));
end;
Responder Con Cita
  #8  
Antiguo 20-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Además de IsLeapYear tenemos DaysInAYear

Function EsBisiesto(PwAnio: Word): Boolean;
Begin
Result := DaysInAYear(PwAnio) = 366
End;
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #9  
Antiguo 20-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pero DaysInAYear utiliza IsLeapYear:

Código Delphi [-]
const
  DaysPerYear: array [Boolean] of Word = (365, 366);

function DaysInAYear(const AYear: Word): Word;
begin
  Result := DaysPerYear[IsLeapYear(AYear)];
end;

// Saludos
Responder Con Cita
  #10  
Antiguo 20-03-2007
richi richi is offline
Miembro
 
Registrado: jun 2006
Ubicación: Portosin - A Coruña
Posts: 51
Poder: 18
richi Va por buen camino
Otra posible manera de hace lo seria poner el primer dia de la fecha del siguiente mes y restandole 1 nos daria los dias.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  fechaUsar : TDate;
  ano, mes, dia : word;
  anoComprobar : string;
begin
  anoComprobar:= '2007';
  fechaUsar:= strtodate('01/03/' +  anoComprobar) - 1;
  DecodeDate(fechaUsar,ano,mes,dia);

  if dia = 29 then
    ShowMessage('Bisiesto')
  else
    ShowMessage('No es bisiesto');
end;
Responder Con Cita
  #11  
Antiguo 20-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Viene a ser lo mismo que comenté antes. DecodeDate necesitará saber si el año es bisiesto para determinar cuál es el día anterior al primero de marzo.

// Saludos
Responder Con Cita
  #12  
Antiguo 20-03-2007
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola,

Cita:
Empezado por richi
Otra posible manera de hace lo seria poner el primer dia de la fecha del siguiente mes y restandole 1 nos daria los dias.


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  fechaUsar : TDate;
  ano, mes, dia : word;
  anoComprobar : string;
begin
  anoComprobar:= '2007';
  fechaUsar:= strtodate('01/03/' +  anoComprobar) - 1;
  DecodeDate(fechaUsar,ano,mes,dia);

  if dia = 29 then
    ShowMessage('Bisiesto')
  else
    ShowMessage('No es bisiesto');
end;
Hombre para eso creo más cómodo lo que he puesto en la primera respuesta. No es muy elegante el forzar el error pero tremendamente efectivo y rápido, sin andarse con rodeos.

Saludos

Última edición por Bicho fecha: 20-03-2007 a las 18:50:34.
Responder Con Cita
  #13  
Antiguo 20-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Oye Bicho, ¿cómo crees que hace StrToDate para generar el error en caso de que le pases un año que no es bisiesto?

// Saludos
Responder Con Cita
  #14  
Antiguo 20-03-2007
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Esto es lo que hay, que yo tambien se mirarlo, eh?
Código Delphi [-]
function StrToDate(const S: string): TDateTime;
begin
  if not TryStrToDate(S, Result) then
    ConvertErrorFmt(@SInvalidDate, [S]);
end;

//Y

function TryStrToDate(const S: string; out Value: TDateTime): Boolean;
var
  Pos: Integer;
begin
  Pos := 1;
  Result := ScanDate(S, Pos, Value) and (Pos > Length(S));
end;

Saludos
Responder Con Cita
  #15  
Antiguo 20-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ajá, y ScanDate utiliza TryEncodeDate:

Código Delphi [-]
function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
var
  I: Integer;
  DayTable: PDayTable;
begin
  Result := False;
  DayTable := @MonthDays[IsLeapYear(Year)];
  if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
    (Day >= 1) and (Day <= DayTable^[Month]) then
  begin
    for I := 1 to Month - 1 do Inc(Day, DayTable^[i]);
    I := Year - 1;
    Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
    Result := True;
  end;
end;



// Saludos
Responder Con Cita
  #16  
Antiguo 20-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Creo que se están corriendo en círculos, solo es necesario utilizar IsLeapYear.

Para que codificar algo que ya está hecho,
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #17  
Antiguo 20-03-2007
cmpimentel cmpimentel is offline
Registrado
 
Registrado: mar 2007
Posts: 3
Poder: 0
cmpimentel Va por buen camino
hola......

hola....


escribeme a mi correo es mas practico y pueda ayudarte en lo que necesites cmpimentel@imfomed.sld.cu



Cita:
Empezado por JM75
Hola a todos. En la aplicación que estoy desarrollando necesito saber si un año es bisiesto o no según la fecha que se introduzca. ¿Hay alguna forma de calcularlo?

Gracias.
Responder Con Cita
  #18  
Antiguo 20-03-2007
cmpimentel cmpimentel is offline
Registrado
 
Registrado: mar 2007
Posts: 3
Poder: 0
cmpimentel Va por buen camino
[quote=cmpimentel]hola....


escribeme a mi correo es mas practico y pueda ayudarte en lo que necesites cmpimentel@imfomed.sld.cu soy informatico sivernetico y vivo en ciudad de la habana, cuba
Responder Con Cita
  #19  
Antiguo 20-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por poliburro
Creo que se están corriendo en círculos, solo es necesario utilizar IsLeapYear.
¡Pues a eso me refiero! Los métodos que describen, requieren, de una u otra forma, saber si el año es o no bisiesto. Por ello, lo más práctico es, o usar IsLeapYear que usa la fórmula que comenta basti.

// Saludos
Responder Con Cita
  #20  
Antiguo 20-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por cmpimentel
escribeme a mi correo es mas practico y pueda ayudarte en lo que necesites
¡Eso! ¡Abajo los foros!

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Saber si es (x86) ó (x64) acertij022 Varios 2 20-02-2007 20:29:53
Saber si es un entero chipsoni Varios 4 06-02-2007 16:52:48
Saber Ip de una PC??? JELIRM API de Windows 4 02-07-2006 22:28:38
Saber la ip del servidor? crievep Conexión con bases de datos 1 05-04-2006 21:22:56
Saber si hay conexion JCR Internet 0 26-04-2004 21:07:06


La franja horaria es GMT +2. Ahora son las 18:27:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi