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