technologies systems software mexico empresa diesel brasil autopartes delphi

systems - delphi technologies



FunciĆ³n inversa de FormatDateTime (8)

Estoy buscando una función para revertir cualquier cadena ( YYYYMDD , YY/MM/DD , YYMMDD , ...) creada por la función FormatDateTime to datetime.

ejemplo

Tengo una fecha de cadena en formato YYYYMMDD creado por FormatDateTime

mydatestr:=FormatDateTime(''YYYYMMDD'',Mydate);

Ahora, ¿cómo puedo convertir mydatestr a DateTime nuevo?

ACTUALIZAR

estas funciones

function StrToDate(const S: string): TDateTime; overload; function StrToDate(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload; function StrToDateTime(const S: string): TDateTime; overload; function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;

no se admite pasar una cadena con el formato para convertir.

Estoy buscando algo como esto

Mydatetime:=InvFormatDatetime(''20091225'',''yyyymmdd'');

o

Mydatetime:=InvFormatDatetime(''20090108'',''yyyyddmm'');


¿Comprobaste StrToDate y StrToDateTime?


Es bastante fácil con la solución existente, la función StrToDateFmt en la unidad rxDateutil.pas del paquete RX, que se puede descargar aquí: http://sourceforge.net/projects/rxlib/

EDITAR:

La función mencionada anteriormente y StrToDateFmt de rxDateutil.pas están haciendo exactamente lo que espera, convirtiendo la cadena en fecha y hora usando la máscara de cadena especificada, el código es demasiado grande para ser incluido, ya que esta unidad también contiene otras funciones de fecha, algunas de ellas necesarias para convertir la cadena a fecha.

Ejemplo de uso:

Result := StrToDateFmtDef(''MM/DD/YYYY'', ''11/11/2011'', Now);


Me gustó la respuesta de Tuncay, pero hubo un par de problemas con ella. Habría dejado un comentario pero no tengo suficientes puntos de reputación.

Entonces, aquí está la versión corregida de la respuesta de Tuncay (enmendando "TFormatSetting" faltando una "s" y especificé el separador de fecha de configuración de formato):

function AnyStringToDate(fmt, dt: String) : TDateTime; var fs : TFormatSettings; Begin fs := TFormatSettings.Create; fs.DateSeparator := ''-''; fs.ShortDateFormat := fmt; result := StrToDateDef(dt, 0, fs); End;

Idéntica a la respuesta de Tuncay, AnyStringToDate se puede utilizar de la siguiente manera:

mydate := AnyStringToDate(''YYYY-MM-DD'', ''2015-01-20'');


Normalmente, solo insertaría los caracteres necesarios para que StrToDate funcione.


Podría usar la función StrToDateFmt de la unidad JvJCLUtils que pertenece a la biblioteca de códigos JEDI

en tu caso :

Function InvFormatDatetime ( dateString :String; dateFormat :String ) : TDateTime; begin Result := JvJCLUtils.StrToDateFmt ( dateFormat, dateString ); end;


Sé que es demasiado tarde, pero solo por interés, con Delphi XE6 en adelante, ahora puede hacer lo siguiente

uses System.DateUtils; var dt: TDateTime; begin dt := ISO8601ToDate(''20190408''); end.

ahora será el 2019/04/08


Sin usar ninguna biblioteca externa, puedes hacer algo como:

function AnyStringToDate(fmt, dt: String) : TDateTime; var fs : TFormatSettings; Begin fs := TFormatSettings.Create; fs.ShortDateFormat := fmt; result := StrToDateDef(dt, 0, fs); End;

y luego usarlo como:

mydate := AnyStringToDate(''YYYY-MM-DD'', ''2015-01-20'');

No he compilado esto, pero la idea es simple.


Function InvFormatDatetime (Cadena:String; Formato:String) : TDateTime; Var PosD, PosM, PosY : Integer; sD, sM, sY : String; begin sd := ''0''; sm := ''0''; sy := ''0''; If Length(Cadena) = Length(Formato) Then Begin Formato := UpperCase(Formato); PosD := Pos(''D'',Formato); PosM := Pos(''M'',Formato); PosY := Pos(''Y'',Formato); sd := Copy(Cadena,PosD,2); sm := Copy(Cadena,PosM,2); if Length(Cadena) = 6 then begin sy := Copy(Cadena,PosY,2); if StrToInt(sy) > 50 then sy := ''19''+sy else sy := ''20''+sy; end else sy := Copy(Cadena,Posy,4); End; Result := EncodeDate(StrToInt(sY), StrToInt(sM), StrToInt(sD)); End;

saludos