Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir YYYYMMDD a date (https://www.clubdelphi.com/foros/showthread.php?t=62689)

marilinspi 08-01-2009 14:53:12

Convertir YYYYMMDD a date
 
Hola a todos necesito convertir un string YYYYMMDD a date, alguna pista.
Gracias desde ya.

marcoszorrilla 08-01-2009 15:09:38

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
dFecha:TDate;
begin
TextoAFecha(Edit1.Text)
end;

function TextoAFecha(S:String):TDate;
var
x:String;
begin
x:=Copy(s,7,2)+'/'+Copy(s,5,2)+'/'+copy(s,1,4);
//Esto es para ver el funcionamiento, bórralo.
ShowMessage(x);

Result:=StrToDate(x);
end;

Un Saludo.

white_zombie 08-01-2009 15:12:52

Hola, para convertir strings a date tienes StrToDate, mira la ayuda de delphi sobre esta función, cambiando el formato de la fecha en TFormatSettings para acomodarlo a tu forma de representación creo que te servira.

Un saludo.

white_zombie 08-01-2009 15:14:49

Marcoszorrilla se me ha adelantado y se ha currado la respuesta mucho mas que yo, espero que te resuelva el problema.

Un Saludo

Caro 08-01-2009 15:23:02

Hola, también puedes utilizar las funciones RightStr, MidStr, LeftStr de la Unit StrUtils.

Código Delphi [-]
function TextoAFecha(S:String):TDate;
var
x:String;
begin
  x := RightStr(Edit1.Text,2)+'/'+
        MidStr(Edit1.Text, 5, 2)+'/'+
        LeftStr(Edit1.Text,4);
 
  Result:=StrToDate(x);
end;

Saluditos

Neftali [Germán.Estévez] 08-01-2009 16:22:18

Muy parecido a lo que ya te comentan (Caro o Román), también puedes utilizar las funciones:

Código Delphi [-]
function EncodeDate(Year, Month, Day: Word): TDateTime;
function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;

Por ejemplo así:

Código Delphi [-]
  d := EncodeDate(StrToInt(copy(s,1,4)), StrToInt(Copy(s,5,2)), StrToInt(Copy(s,7,2)));

Con la ventaja de que si la fecha es incorrecta te lo detectará (2008/13/13).

marilinspi 08-01-2009 19:38:05

Hola, muchas gracias por la pronta respuesta. Lo resolvi con la opcion de marcoszorrilla. Gracias hasta la proxima

marilinspi 08-01-2009 20:19:40

hola yo de nuevo una ayudita mas, yo obtengo este string como respuesta de algo '2009-01-08T20:40:49.523-02:00' y necesito compararlo con la fecha y hora actual para seber si esta vencido o no.. como haria? es decir, tendria que convertir eso a TDateTime... Disculpen las molestias, es que estoy con lo de la Factura Electronica y se me presentasn cosas a cada rato. Gracias, espero su ayuda

marcoszorrilla 08-01-2009 22:03:02

Para el ejemplo de formato que presentas prueba esto otro:
'2009-01-08T20:40:49.523-02:00'

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
dFecha:TDate;
begin
//ShowMessage(FormatDateTime('dd/mm/yyyy HH:mm:ss',TextoAFechayHora(Edit1.Text)));
TextoAFechayHora(Edit1.Text);
end;

function TextoAFechayHora(S:String):TDateTime;
var
aa,mm,dd,hh,mn,ss,ms:Word;

begin
  Try
  aa:=StrToInt(copy(s,1,4));
  mm:=StrToInt(Copy(s,6,2));
  dd:=StrToInt(Copy(s,9,2));

  hh:=StrToInt(Copy(s,12,2));
  mn:=StrToInt(Copy(s,15,2));
  ss:=StrToInt(Copy(s,18,2));
  ms:=00;

  Result:=EncodeDateTime(aa,mm,dd,hh,mn,ss,ms);
  Except
  ShowMessage('formato de datos erroneo');
  end
end;


Un Saludo.

marilinspi 08-01-2009 22:08:26

pero que grande!!!! muchisimas gracias... voy a aprender a usar esa funcion, esta buenisima

BlueSteel 20-01-2011 00:07:17

Estimados, estaba implementando la funcion que dices, pero parece que me falta agregar una unidad ya que cuando compilo me da error

Cita:

[Error] rutinas.pas(48): Undeclared identifier: 'EncodeDateTime'
[Error] rutinas.pas(50): Undeclared identifier: 'ShowMessage'
[Fatal Error] AbonoCodigo.dpr(23): Could not compile used unit 'rutinas.pas'
gracias...

Salu2:p:D

ecfisa 20-01-2011 06:01:26

Hola BlueSteel.

La función EncodeDateTime y el procedimiento ShowMessage, están declarados en las units DateUtils y Dialogs respectivamente.

Un saludo.

BlueSteel 20-01-2011 15:30:48

Gracias ecfisa.... eran esas las units que faltaban...

ahora estoy con otro problema...

Te cuento...

en un Timer, le asigno la Fecha y Hora del Sistema a una variable de Tipo String de la siguiente forma

Código Delphi [-]
vFecha:=TimeToStr(Now);
vHora:=DateToStr(Now);

Si quiero juntar eso, lo hago con el Concat y me resulta

Código Delphi [-]
ShowMessage(Concat(vFecha,' ',vHora);

por ej. me entrega : 20/01/2011 11:19:23

La funcion la tuve que modificar por que el formato que entregaba era YYYYMMDD

Asi que la deje así

Código Delphi [-]
function TextoAFechayHora(S:String):TDateTime;
var
aa,mm,dd,hh,mn,ss,ms:Word;

begin
  Try
  dd:=StrToInt(Copy(s,1,2));
  mm:=StrToInt(Copy(s,4,2));
  aa:=StrToInt(copy(s,7,4));

  hh:=StrToInt(Copy(s,12,2));
  mn:=StrToInt(Copy(s,15,2));
  ss:=StrToInt(Copy(s,18,2));
  ms:=00;

  Result:=EncodeDateTime(dd,mm,aa,hh,mn,ss,ms);
  Except
  ShowMessage('formato de datos erroneo');
  end
end;

Quiero insertar el dato en la Tabla, para lo cual lo asigno así

Código Delphi [-]
Datos.AQ_Edit.Parameters[3].Value := TextoAFechayHora(Concat(vFecha,' ',vHora));

Ojo.. que cuando inserto desde un DateTimePicker me funciona bien.. pero quiero eliminar este componente del formulario...

Código Delphi [-]
Datos.AQ_Edit.Parameters[3].Value := sFec.DateTime;

pero en tiempo de ejecución me aparece un error

"20/1/2011 11:23:55,0" is not a valid date and time y muestra que el formato no es valido

mi consulta es... por que en el mesaje el concat me muestra el mes con 01 pero el mensaje del error me dice que el mes solo es 1..

bueno, y por ende como puedo solucionar esto..

Salu2

rrf 20-01-2011 17:04:02

Hola BlueSteel.

Cita:

pero en tiempo de ejecución me aparece un error

"20/1/2011 11:23:55,0" is not a valid date and time y muestra que el formato no es valido
Lo primero que se me ocurre que podría ser la causa es: ¿Será porque espera Mes/Día/Año y lo que le ofreces es Día/Mes/Año?

¿Lo has probado con una fecha que valga para ambos formatos (como 3/2/2011)? Si al hacerlo no te da error, entonces muy posiblemente esa sea la causa.

Saludos.

ecfisa 20-01-2011 18:42:28

Hola BlueSteel.

Coincido con lo que dice el amigo rrf.
Hice la prueba de este modo y no me dió ningún error:
Código Delphi [-]
function TextoAFechayHora(S:String):TDateTime;
var
  aa,mm,dd,hh,mn,ss,ms:Word;
begin
  try
   dd:= StrToInt(Copy(s,1,2));
   mm:= StrToInt(Copy(s,4,2));
   aa:= StrToInt(copy(s,7,4));
   hh:=StrToInt(Copy(s,12,2));
   mn:=StrToInt(Copy(s,15,2));
   ss:=StrToInt(Copy(s,18,2));
   ms:=00;
   Result:= EncodeDateTime(aa, mm, dd, hh, mn, ss, ms);
  except
   raise Exception.Create('Formato inválido');
  end
end;

Con esta llamada:
Código Delphi [-]
...
  vFecha:= DateToStr(Now);
  vHora:= TimeToStr(Now);
  TextoAFechayHora(Concat(vFecha,' ',vHora));
...

Un saludo.

BlueSteel 20-01-2011 20:59:58

Muchas gracias...

efectivamente era este el problema:p:p:p

Código Delphi [-]
Result:= EncodeDateTime(aa, mm, dd, hh, mn, ss, ms);

crei que al cambiar el formato de la fecha tenia que cambiar el formado de codificar....

Salu2:p:D


La franja horaria es GMT +2. Ahora son las 09:25:42.

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