Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al trabajar con fechas (https://www.clubdelphi.com/foros/showthread.php?t=42210)

eldiegofg 08-04-2007 01:16:40

Error al trabajar con fechas
 
Hola gente del foro, ante todo muchas gracias por su atencion ya que mi primer y unica pregunta hasta ahora se han molestado en contestarmela en forma rapida, clara y precisa, cosa que para usuarios nuevos como yo, son de gran valor y utilidad.

El motivo de esta nueva consulta es que al trabajar con tipos de datos de fecha (TDateTime) siempre me aparece el mismo resultado: "30/12/1899"
Estoy intentando hacer diferencias entre una fecha final y una fecha inicial para obtener el numero de dias transcurridos y probe dandole valores constantes a dos variables tipo TDateTime y como resultado obtengo la fecha antes mencionada. Alguna sugerencia?
Muchas gracias por su tiempo. Saludos

Lepe 08-04-2007 01:29:23

Primero es necesaria una explicación acerca de ese gran desconocido TDatetime.

Una fecha en delphi es un valor double, donde la parte entera, son los días transcurridos desde el calendario base (31/12/1899), y la parte fraccionaria las horas minutos, segundos y milisegundos.

por ejemplo, sumar 1 día a una fecha, es tan simple como esto:
Código Delphi [-]
var c :Tdatetime;
begin
  c:= now; // fecha y hora actual del sistema.
  c:= c+1; // incrementamos la fecha en 1 día

Para tratar con horas, debemos hacer cálculos, por ejemplo, sumar una hora a la fecha y hora actual:
Código Delphi [-]
var c :Tdatetime;
begin
  c:= now; // fecha y hora actual del sistema.
  c:= c+(1/24); // incrementamos la fecha en 1 hora
como un día tiene 24 horas,

1/24 corresponde a 1 hora.
1/(24*60) corresponde a un minuto.
1/(24*60*60) corresponde a 1 segundo

De esta forma se pueden hacer todo tipo de cálculos correctamente y sin error.

Delphi, en la unidad DateUtils tiene toda una batería de funciones para tratar con fechas y horas sin tener que hacer cálculos, por ejemplo:
- IncDay
- IncMonth
- IncYear
- IncHour

y otras para calcular diferencias:
- DaysBetween (diferencia en días)
- DaySpan (diferencias en días y fracciones de días)
- MinutesBetween
- HoursBetween

Te recomiendo que le eches una visual, por ejemplo en la ayuda de Delphi.

De todo lo anterior, podrías hacer el cálculo de dos formas:
Código Delphi [-]
var Dias:integer;
begin
  dias := fecha1 - fecha2;
 
// o bien:
  dias := DaysBetween(fecha1, fecha2);

Saludos

eldiegofg 10-04-2007 02:08:29

No encuentro la unit DateUtils, ni tampoco las funciones
- DaysBetween (diferencia en días)
- DaySpan (diferencias en días y fracciones de días)
- MinutesBetween
- HoursBetween
- Etc...

Tengo Delphi 5, perdon por mi ignorancia pero puede ser por eso, que sea la version de mi Delphi sea demasiado antigua?? Muchas gracias

egostar 10-04-2007 02:26:14

Primero que nada, lo que yo creo es que estas trabajando con TDateTimePicker o con MonthCalendar y borraste la propiedad Date. Por eso te la deja como 31/12/1899.

En tiempo de ejecución pon lo siguiente:

Código Delphi [-]
//si estas usando un DateTimePicker
procedure TForm1.FormShow(Sender: TObject);
begin
   DateTimePicker1.Date := Now;
end;

//si estas usando un MonthCalendar
procedure TForm1.FormShow(Sender: TObject);
begin 
   MonthCalendar1.Date := Now;
end;

Salud OS.

Lepe 10-04-2007 09:44:24

Cita:

Empezado por eldiegofg
Tengo Delphi 5 puede ser por eso, que sea la version de mi Delphi sea demasiado antigua?? Muchas gracias

Muy Posiblemente sea eso, no puedo asegurarlo ya que de delphi 3 salté a delphi 6 y allí ya estaban esas funciones.

Tendrías que crear algunas rutinas que lo hagan, teniendo en cuenta mi mensaje anterior, podrías codificarlas... o eso espero.

Saludos

eldiegofg 11-04-2007 17:51:24

1 Archivos Adjunto(s)
Hola gente, les cuento que me pase a la version 7 de Delphi y si bien encontre las funciones y la unit mencionadas sigo teniendo el mismo problema: casi todas las operaciones que hago dan como resultado 30/12/1899. Es raro porque no es 31/12/1899 como la base del calendario sino 30/12/1899. Les dejo por las dudas el fuente por si lo quieren ver, capaz estoy haciendo algo mal... espero no me reten, jaja. Muchas gracias

egostar 11-04-2007 18:04:53

Bueno tienes varios detalles en tu código.

1. Usas variables de tipo Double, mejor usa tipo TDateTime.
2. Estas buscando dias transcurridos entre las fechas.
3. Muestras los dias como si fuera fecha y no es así, es un valor entero.

Aqui te pongo la modificación a tu código.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  fecha: Real;
  fecha1,fecha2:TDateTime;
begin
  fecha1:=StrtoDate('11/11/06');
  fecha2:=StrtoDate('10/10/06');
  fecha:=daysbetween(fecha1,fecha2);
  edit1.Text:=floattostr(fecha);
end;

Salud OS.

alixp23 13-04-2007 07:12:39

Ayuda con tdate time
 
Como puedo hacer esto mismo que ustedes explican pero en c++????

eldiegofg 14-04-2007 02:33:54

Ahora si anduvo bien, muchas gracias. En realidad habia probado todo lo que decis menos pasar la fecha como una cadena. Yo la fecha la asignaba directamente a la variable TdateTime y en el resultado de cualquier operacion me daba cero. Por que se hace eso de asignar como cadena y despues convertirla a date en vez de ingresarla como TdateTime directamente??

egostar 14-04-2007 03:52:17

Cita:

Empezado por eldiegofg
Ahora si anduvo bien, muchas gracias. En realidad habia probado todo lo que decis menos pasar la fecha como una cadena. Yo la fecha la asignaba directamente a la variable TdateTime y en el resultado de cualquier operacion me daba cero. Por que se hace eso de asignar como cadena y despues convertirla a date en vez de ingresarla como TdateTime directamente??

No se exactamente porque al pasarlo como tu lo hacías el resultado da cero, pero así sucede, pienso que tal ves esta agregando también la parte Time y eso le provoque alguna inconsistencia a la función DaysBetween.

Pero, si lo que quieres es pasar directamente una variable TDateTime puedes hacer esto y funciona bien.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  fecha: Integer;
  fecha1,fecha2:TDateTime;
begin
  fecha1:= DateTimePicker1.Date;
  fecha2:= DateTimePicker2.Date;
  fecha:=daysbetween(fecha1,fecha2);
  edit1.Text:=floattostr(fecha);
end;
Aqui estoy usando dos componentes adicionales que son los TDateTimePicker con la propiedad Date. Aunque se puede simplificar de otra manera. pero la idea es que observes la diferencia, con el StrtoDate.

Aquí la simplificación del código.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Dias: Integer;
begin
  Dias := daysbetween(DateTimePicker1.Date,DateTimePicker2.Date);
  edit1.Text:=floattostr(Dias);
end;
Salud OS.

Caral 14-04-2007 04:09:57

Hola
Hace ya algun tiempo el Maestro Al Gonzalez hizo el codigo para restar fechas:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
FechHora1 :TDateTime;
FechHora2 :TDateTime;
Dias :Integer;
begin
   FechHora1:= DateTimePicker1.DateTime;
   FechHora2:= DateTimePicker2.DateTime;
   Dias := Trunc (FechHora2) - Trunc (FechHora1);
   Edit1.Text:= IntToStr(Dias);
end;
Saludos

Maury Manosalva 16-04-2007 22:49:42

que BD Utilizas
 
Indicame que BD utilizas, tal vez te pueda ayudar..


La franja horaria es GMT +2. Ahora son las 11:47:18.

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