delphi delphi-xe2 tdatetime formatdatetime

datetime delphi format



La conversión con StrToDateTime y TFormatSettings no funciona (2)

Este código debería funcionar en Delphi XE2, pero da un error "no es una fecha y hora válidas" en la conversión de StrtoDateTime:

procedure TForm2.Button1Click(Sender: TObject); var s: string; d: TDateTime; FmtStngs: TFormatSettings; begin GetLocaleFormatSettings(GetThreadLocale, FmtStngs); FmtStngs.DateSeparator := #32; FmtStngs.ShortDateFormat := ''dd mmm yyyy''; FmtStngs.TimeSeparator := '':''; FmtStngs.LongTimeFormat := ''hh:nn''; s := FormatDateTime('''', Now, FmtStngs); d := StrToDateTime(s, FmtStngs); end;

¿Alguna pista?


Si desea convertir algunos formatos de fecha y VarToDateTime especiales, debería usar mejor VarToDateTime lugar de StrToDateTime. Solo eche un vistazo a la implementación de ambos y reconocerá que StrToDateTime es de alguna manera ... y VarToDateTime le preguntará al sistema operativo si no puede determinarlo por sí mismo.

Esto funciona con Delphi XE3 (pero también debería funcionar con versiones anteriores):

procedure TForm2.Button1Click( Sender: TObject ); var s: string; d: TDateTime; FmtStngs: TFormatSettings; begin GetLocaleFormatSettings( GetThreadLocale, FmtStngs ); FmtStngs.DateSeparator := #32; FmtStngs.ShortDateFormat := ''dd mmm yyyy''; FmtStngs.TimeSeparator := '':''; FmtStngs.LongTimeFormat := ''hh:nn''; s := FormatDateTime( '''', Now, FmtStngs ); d := VarToDateTime( s ); end;


Tienes dos problemas

  1. No puede usar un WhiteSpace como DateSeparator, porque las rutinas internas para analizar la cadena usan este carácter para determinar las partes de fecha y hora de la cadena.

  2. La función StrToDateTime no funciona cuando la parte de los meses usa la cadena mmm , esto se informa en este QC 23301