PDA

Ver la Versión Completa : Formato de fechas y DateTimePicker.


aoiTo
22-08-2004, 20:34:36
hola, un saludo todos/as, vereis, estoy haciendo una pequeña aplicación en C++ Builder 6, en la que quiero sacar un listado de todo entre lafecha 1 y la fecha 2. El problema es que el DateTimePicker devuelve la fecha en formato Dia/Mes/Año, y yo necesito que me lo devuelva en Mes/Dia/Año, ya que para hacer el select, Interbase me pide que sea en el formato Mes/Dia/Año. He probado la opcion Format, pero esta propiedad solo sirve para que de forma visual solo se vea en ese formato, ya que DateTimePicker->Date lo devuelve de la forma en la que a mi no me interesa.

¿Alguna idea? Gracias de antemano. ;)

jachguate
23-08-2004, 11:12:51
Un DateTimePicker te devuelve una fecha en el tipo TDateTime, que si te das una vuelta por la ayuda, verás que es un número, que no tiene intrinsecamente ningún tipo de formato.

Existen varias funciones, entre ellas FormatDateTime, DateTimeToStr, DateToStr, etc que te ayudan a formatear fechas.

Si es para pasarlo a una base de datos, es mejor el uso de parámetros en las sentencias SQL, por dos razones:

Te olvidas de los problemas con los formatos de fechas, puesto que la decisión del formato a usar queda entre los componentes de acceso y el cliente de la base de datos, siendo este regularmente numérico
Algunos motores, como oracle, evitan reanalizar de nuevo sentencias que usan parámetros y se ejecutan con frecuencia, consiguiente una notable mejora en el desempeño.

Si no sabes que son parámetros, y como asignarles valores en una sentencia SQL, te recomiendo usar la búsqueda de los foros, pues el tema se ha tratado multiples veces por aqui, y cualquier cosa dicha para delphi, valdrá igual para c++builder (en este caso).

Hasta luego.

;)

JoseBozzano
23-08-2004, 19:04:48
hola, no creo que sea lo mas optimo, pero quizas te ayude en algo, a pesar que no esta hecho en C++, pero seria cuestion de migrarlo nada mas, de hecho, lo que menciono jachguate es lo mas optimo.

Esta funcion podria ser mas sencilla para tu caso, pero yo la hice cuando necesité incluir los ceros a la izquierda en el mes y el dia. Chau.

Funcion llamadora...

procedure TForm1.Button1Click(Sender: TObject);
begin
form1.Edit1.Text:=
form1.fecha_formato(datetostr(form1.DateTimePicker1.Date),'dd/mm/aa');
end;

Funcion llamada...

function tform1.fecha_formato(fecha,formato:string):string;
var
fecha_o,ch,d,m,a:string;
aux,largo,i,u:integer;
temp:string;
vector:array[0..9] of string;
begin
i:=0;
u:=i;
aux:=0;
largo:=length(fecha);
while (i <= 9) do begin
ch:=copy(fecha,i+1,1);
if (ch <> '/') then begin
vector[u]:=ch;
aux:=aux + 1;
i:=i+1;
u:=u+1;
end else begin
if aux = 2 then begin
i:=i+1;
u:=i-1;
aux:=0;
end else begin
temp:=vector[u - 1];
vector[u - 1]:='0';
vector[u]:=temp;
aux:=0;
i:=i+1;
u:=u+1;
end;
end;
end;
fecha_o:=vector[0];
for i:=0 to largo - 2 do begin
fecha_o:=fecha_o + vector[i + 1];
end;
d:=copy(fecha_o,3,2);
m:=copy(fecha_o,1,2);
a:=copy(fecha_o,5,4);
if formato = 'mm/dd/aa' then
result:= d + '/' +m + '/' + a ;
if formato = 'dd/mm/aa' then
result:= m + '/' + d + '/' + a ;
end;

Gydba
23-08-2004, 22:55:12
Hola,

No es que sea hincha ni mucho menos pero mirá que lindo queda el código con las etiquetas DELPHI del foro:

function tform1.fecha_formato(fecha,formato:string):string;
var
fecha_o,ch,d,m,a:string;
aux,largo,i,u:integer;
temp:string;
vector:array[0..9] of string;
begin
i:=0;
u:=i;
aux:=0;
largo:=length(fecha);
while (i <= 9) do begin
ch:=copy(fecha,i+1,1);
if (ch <> '/') then begin
vector[u]:=ch;
aux:=aux + 1;
i:=i+1;
u:=u+1;
end else begin
if aux = 2 then begin
i:=i+1;
u:=i-1;
aux:=0;
end else begin
temp:=vector[u - 1];
vector[u - 1]:='0';
vector[u]:=temp;
aux:=0;
i:=i+1;
u:=u+1;
end;
end;
end;
fecha_o:=vector[0];
for i:=0 to largo - 2 do begin
fecha_o:=fecha_o + vector[i + 1];
end;
d:=copy(fecha_o,3,2);
m:=copy(fecha_o,1,2);
a:=copy(fecha_o,5,4);
if formato = 'mm/dd/aa' then
result:= d + '/' +m + '/' + a ;
if formato = 'dd/mm/aa' then
result:= m + '/' + d + '/' + a ;
end;

JoseBozzano, como veo que tenés pocos mensajes calculo que debés ser nuevo así que te doy la bienvenida. Por otro lado no sería malo que mirarás la guía de estilo del foro...
http://www.clubdelphi.com/foros/guiaestilo.php

Saludos!

OSKR
09-03-2005, 20:49:34
Señores!!! La solucion para el chamo solo consiste en establecer ShortDateFormat="mm/dd/yyyy"; antes de cualquier operacion a realizar con fechas con cualquier componente relacionado con las mismas.y ya!. Esta es una variable global en Builder, supomgo q su Delphi puede q tambièn lo tenga!

marcoszorrilla
09-03-2005, 20:53:49
Creo que no has captado bien el tema, una cosa es el formato de fecha que tengamos, corto, largo, mm/dd/yy .... y otra es que si utilizamos un TDateTimePicker éste almacena fecha y hora y si nos queremos llevar solamente la hora o la fecha, de que manera tenemos que interactuar con este control.

Un Saludo.

roman
09-03-2005, 22:27:58
Señores!!! La solucion para el chamo solo consiste en establecer ShortDateFormat="mm/dd/yyyy"; antes de cualquier operacion a realizar con fechas con cualquier componente relacionado con las mismas.y ya!. Esta es una variable global en Builder, supomgo q su Delphi puede q tambièn lo tenga!

¿A qué viene esta llamada de atención medio año después del último mensaje? A estas alturas quien formuló la pregunta seguramente ya está en otro proyecto. Además tu solución es tan válida como el uso de una función de formato con la ventaja de esta última de que sólo afectas al parámetro en sí y no al resto de la aplicación que puede estar desplegando fechas en otras partes. Pero más que nada, ya el compañero jachguate lo dijo en su día, lo mejor es usar parámetros por las razones que él mismo dió.

// Saludos

OSKR
11-03-2005, 15:18:36
Para marcoszorrilla:El DateTimePicker y creo q por lo general el resto de componentes se rigen bajo este formato (es decir, el q tenga la variable ShortDateFormat), si interactuamos con bases de datos usando estos componentes puede q no no obtengamos los resultados esperados, particularmente tenia este problema con Interbase y la solucion fue simple y llanamente alterar el formato de la variable, a partir de ahi en ella si se almacenaba lo q esperaba y para mostrar al usuario la retorno a su estado original y el DateTimePicker trabajaba de acuerdo a ella, en cuanto a la hora no veo en q parte esta escrito algo referente a ella (en aoiTo) solo veo q tiene o tenia un problema con el formato.

Para roman:
Me disculpo primeramente si en algun momento mi vocabulario los llego a provocar, no escribi en "tono" de regaño sino de "buena noticia", en cuanto al tiempo no considero q si han pasado años de haberse formulado la pregunta sea ese el motivo para no contestarla (tambien lo hago en algunos otros foros) puesto q hay usuarios q pueden explorar este foro y ver soluciones a sus inquietudes asi sean algo viejas (como yo!!! he encontrado soluciones aunque la pregunta ha sido mas vieja q Matusalèn), con respecto al uso de una funciòn no mencionè q fuera invàlida simplemente intentè dar una solucion mas corta (aunque reconozco q no es la mejor si uso fechas con hilos, no me topado con ese caso), ignorarè como siempre la fecha de la pregunta pero si mejorarè la manera de expresarme.......................................:) Saludos!

marcoszorrilla
11-03-2005, 15:26:24
Para marcoszorrilla:El DateTimePicker y creo q por lo general el resto de componentes se rigen bajo este formato (es decir, el q tenga la variable ShortDateFormat)
ShortDateFormat, solamente sirve para mostrar la fecha de una u otra manera, la fecha siempre tendrá 4 dígitos para el año, una solución para no depender del formato de la fecha es utilizar parámetros.

Un Saludo.

egarc
08-12-2006, 02:13:39
Para este problema, si sólo quieres grabar la fecha del DateTimePicker sólo pones:

Fecha:=DateTimepicker1.date;
Hora:=DateTimepicker1.time;

aca ya tienes la hora y la fecha del date time picker