2010-03-23 13 views
14

Busco a una función para revertir cualquier cadena (YYYYMDD, YY/MM/DD, YYMMDD, ...) creado por la función FormatDateTime de fecha y hora.función inversa de FormatDateTime

ejemplo

tengo una cadena de fecha en formato YYYYMMDD creado por FormatDateTime

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

ahora cómo puedo convertir mydatestr a DateTime de nuevo?

ACTUALIZACIÓN

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 soporta pasar una cadena con el formato para convertir.

Busco algo como esto

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

o

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

posible duplicado de [? ¿Cómo se convierte un ISO 8601 a una cadena de Delphi TDate] (http://stackoverflow.com/questions/6651829/how-do-i-convert-an-iso- 8601-string-to-a-delphi-tdate) – NGLN

Respuesta

9

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

EDIT:

se mencionó anteriormente la función y StrToDateFmt de rxDateutil.pas son haciendo exactamente lo que espera, convirtiendo cadena a fecha y hora utilizando una 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 cadenas a la fecha.

Ejemplo de uso:

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

muchas gracias, la función funciona muy bien. – Salvador

+1

Esta función también se ha portado a JVCL. Está en la unidad "JvJCLUtils" – awmross

+1

Tenga en cuenta que StrToDateFmt solo hace fechas puras. Por ejemplo, no convertirá 'aaaammddhhmmss'. –

1

¿Ha comprobado StrToDate y StrToDateTime?

+0

Gah! ¡He sido ninja! x.x +1 –

+0

@Liz, conocía estas funciones, y no son compatibles con la funcionalidad que estoy buscando. – Salvador

0
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

+0

Esta función supone que los únicos formatos de día y mes utilizados son DD y MM, cuando de hecho pueden tener entre 1 y 4 caracteres, y cualquier formato amy aparece más de una vez. Este código también ignora 'TwoDigitYearCenturyWindow'. –

-3

Normalmente, me basta con insertar los caracteres necesarios para obtener StrToDate para trabajar.

3

Usted podría utilizar StrToDateFmt función de la unidad de JvJCLUtils perteneciente a JEDI Code Library

en su caso:

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

Sin utilizar cualquier biblioteca externa, puede 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 úselo como:

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

No he compilado esto, pero la idea es simple.

3

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

Por lo tanto, aquí está la versión corregida de la respuesta de Tuncay (se modifica "TFormatSetting" falta una "s" y especifica la configuración de formato de fecha separador):

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'); 
+0

¡Gracias por la solución! –