Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir de un formato de fecha en string a TDateTime (https://www.clubdelphi.com/foros/showthread.php?t=73633)

fide_uci 06-05-2011 05:38:26

Convertir de un formato de fecha en string a TDateTime
 
Hola amigos. Tengo un problemita que me hace falta solucionar para poder continuar con una aplicacion que estoy haciendo. El problema es que en un fichero una de las lineas contiene la fecha, pero en este formato.

Wed, Jul 22, 2009 at 1:05 AM

Entonces tengo que leer esa linea y de ella obtener el TDateTime correspondiente. Creo que son StrToDateTime se puede hacer. Pero por mas que lo intento no lo logro. Alguien me puede ayudar o darme una idea de como hacer esto?.

Gracias desde ya !

oscarac 06-05-2011 05:56:31

podrias colocar algo del codigo que estas usando? para tener una idea de como lo estas haciendo?

fide_uci 06-05-2011 06:01:22

Si claro. Disculpenme por no poner algo de codigo. Aca les dejo la funcion que hice que lo que hace es cojer un archivo de texto con la siguiente extructura y devolver un idMessage con los datos ya incluidos.

Aca los datos del fichero que tengo que leer.
Código:

usuario <usuario@domio.com> //De
usuario <usuario@domio.com> //Para
prueba //Asunto
Wed, Jul 22, 2009 at 1:05 AM //Fecha (Aca es donde no consigo convertir a TDateTime)

Esto es un ejemplo de lo que seria el contenido
del correo en el mensaje enviado.

Aca la funcion.

Código Delphi [-]
procedure TForm1.GetMessageFromTXT(pFileName: string; var pIdMessage: TIdMessage);
var
  vStringList: TStringList;
  vDateTime: TDateTime;
begin

  vStringList := TStringList.Create;

  //Formateando la Fecha/Hora

  {The following example:

      S := FormatDateTime('"The meeting is on" dddd, mmmm d, yyyy, ' +
        '"at" hh:mm AM/PM', StrToDateTime('2/15/95 10:30am'));

    assigns 'The meeting is on Wednesday, February 15, 1995 at 10:30 AM' to
    the string variable S. }

  LongDateFormat := 'ddd, mmm d, yyyy "at" hh:mm AM/PM';
  ShortDateFormat := 'ddd, mmm d, yyyy "at" hh:mm AM/PM';

  try
    vStringList.LoadFromFile(pFileName);

    pIdMessage.From.Text := vStringList.Strings[0];
    pIdMessage.Recipients.Add.Text :=  vStringList.Strings[1];
    pIdMessage.Subject := vStringList.Strings[2];

    //Fecha/Hora
    {if TryStrToDateTime(vStringList.Strings[3], vDateTime, vFormatSettings) then
      pIdMessage.Date := vDateTime
    else
      ShowMessage('Explote aqui: ' + vStringList.Strings[3]);}

    vDateTime := StrToDateTime(vStringList.Strings[3]);

    pIdMessage.Date := vDateTime;    

    vStringList.Delete(0);
    vStringList.Delete(0);
    vStringList.Delete(0);
    vStringList.Delete(0);
    vStringList.Delete(0);

    pIdMessage.Body.Text := vStringList.Text;

  finally
    vStringList.Free;
  end;

end;

oscarac 06-05-2011 06:11:11

q resultado obtienes?

sabes? se me ocurre que en lugar de hacerlo con una funcion podrias "armarte" tu mismo una cadena

eliminando los 4 primeros caracteres y jalando los 3 siguientes tienes el mes
dejas un espacio y continuas hasta la siguiente coma (,) y tienes el dia 5 caracteres mas y tienes el anio....
y ahi podrias usar un decodedate para armar la fecha....
siempre y cuando se tenga el mismo formato obvio

no se.. es una idea...

fide_uci 06-05-2011 13:49:41

Bueno, la idea que me expones ya l tenia en mente por que hace algun tiempo la vi, ademas en la ayuda de Delphi he visto como utilizan en Decode\Encode para las fechas y horas y no estaria mal implementarlo de la manera que dices. Lo que sucede que yo creia que esto se podia hacer de la forma en que yo lo he estado intentando. Pero me parece que el unico formato de entrada que aceptan las funciones de fecha/hora son los clasicos como MM\DD\YYYY HH:MM:SS AM/PM. Bueno pues voy a implementarlo asi como me dices cuando termine te comento que tal me va.

fide_uci 06-05-2011 16:19:25

Bueno aqui esta la funcion que he utilizado ya para convertir la dichosa linea con la fecha y hora en el formato dado a algo que delphi entienda. Aqui les dejo el codigo.

Ha, por cierto la clase que utilizo ahi es una que me permite sacar los tokens, o parametros separados por coma o espacio del string. Si hace falta me dicen y publico la Unit con la definicion de la clase.

Aca el codigo.

Código Delphi [-]
procedure TForm1.GetMessageFromTXT(pFileName: string; var pIdMessage: TIdMessage);
var
  vStringList: TStringList;
  vDateTime: TDateTime;
  vCToken: TToken;
  vNum, vX: Byte;
  vStrDateTime, vStrUtil: string;
begin

  vStringList := TStringList.Create;
  vCToken := TToken.Create;

  try
    vStringList.LoadFromFile(pFileName);

    pIdMessage.From.Text := vStringList.Strings[0];
    pIdMessage.Recipients.Add.Text :=  vStringList.Strings[1];
    pIdMessage.Subject := vStringList.Strings[2];


    vCToken.Text := vStringList.Strings[3];
    vCToken.Seps := [',',' ']; //Separadores utilizados
    vCToken.Count;

    vCToken.First;
    vNum := 0;
    while vCToken.MoreTokens do
    begin
      Inc(vNum);
      //1: Dia del mes, que no es necesario
      //2: Mes (que tenemos que sacar su indice del array de meses)
      //3: #dia (ej. 22)
      //4: Año
      //5: "at"
      //6: La Hora
      //7: AM o PM
      vStrUtil := StringReplace(vCToken.LastToken, ' ', '', [rfReplaceAll]);

      case vNum of
        2: begin
            (*Aca tenemos que saber en que mes estamos para extraerlo
             OJO: Esto va a fallar cuando el SO este en español o sea
             el arreglo de meses no contenga los meses en ingles. *)

            //**** Recorremos todos los meses
            for vX := 1 to 12 do
              begin
                //Sacamos el numero del mes dado
                if LowerCase(ShortMonthNames[vX]) = LowerCase(vStrUtil) then
                  begin
                    vStrDateTime := IntToStr(vX);
                    break;
                  end;   
              end;
           end;
        3: begin
            vStrDateTime := vStrDateTime + '/' + vStrUtil;
           end;
        4: begin
            vStrDateTime := vStrDateTime + '/' + vStrUtil;
           end;
        6: begin
            vStrDateTime := vStrDateTime + ' ' + vStrUtil;
           end;
        7: begin
            vStrDateTime := vStrDateTime + ' ' + vStrUtil;
           end;
      end;

      vCToken.Next;
    end;

    vDateTime := StrToDateTime(vStrDateTime);

    pIdMessage.Date := vDateTime;    

    vStringList.Delete(0);
    vStringList.Delete(0);
    vStringList.Delete(0);
    vStringList.Delete(0);
    vStringList.Delete(0);

    pIdMessage.Body.Text := vStringList.Text;

  finally
    vStringList.Free;
    vCToken.Free;
  end;

end;


La franja horaria es GMT +2. Ahora son las 11:24:15.

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