2010-07-25 6 views
14

En mi código me encuentro con un problema. Código de ejemplo:'23/02/2011 12:34:56 'no es fecha y hora válidas

var 
    d1: tdatetime 
begin 
    d1 := strtodatetime('23/02/2011 12:34:56'); 
end; 

pero está dando el error:

'23/02/2011 12:34:56' is not valid date and time

¿Qué hay de malo en lo que estoy haciendo?

+2

Parece un problema de configuración regional: eso es una fecha Reino Unido válida pero no fecha en los Estados Unidos, por ejemplo. –

+5

Puse una advertencia en la función "StrToDate [Time]" [s]: * "Advertencia, esta función depende de la configuración regional y puede fallar miserablemente en otras computadoras. Es por eso que nunca debe usar una cadena para ingresar, editar o almacenar una fecha, nunca! "*. –

Respuesta

31

la función StrToDateTime utiliza el ShortDateFormat y DateSeparator para convertir la parte de la fecha y la LongTimeFormat y TimeSeparator a la pieza del tiempo. por lo que la cadena debe coincidir con estas variables para convertir la cadena a TDateTime. en su lugar, puede usar StrToDateTime con el parámetro TFormatSettings para analizar su cadena.

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

cheque esta muestra

Var 
StrDate : string; 
Fmt  : TFormatSettings; 
dt  : TDateTime; 
begin 
fmt.ShortDateFormat:='dd/mm/yyyy'; 
fmt.DateSeparator :='/'; 
fmt.LongTimeFormat :='hh:nn:ss'; 
fmt.TimeSeparator :=':'; 
StrDate:='23/02/2011 12:34:56'; 
dt:=StrToDateTime(StrDate,Fmt); 
+0

¿Por qué usar 'nn' en' LongTimeFormat' en lugar de 'mm' en minutos? – CinCout

+1

Porque _nn_ significa minutos y _mm_ significa meses. – RRUZ

+0

Gracias por la aclaración :) No había notado la ambigüedad. – CinCout

2

Esto se debe a que el formato de fecha/hora de su código no coincide con el formato de fecha/hora de la configuración regional.

De la documentación (D2009):

The S parameter must use the current locale's date/time format. In the US, this is commonly MM/DD/YY HH:MM:SS format. Specifying AM or PM as part of the time is optional, as are the seconds. Use 24-hour time (7:45 PM is entered as 19:45, for example) if AM or PM is not specified.

Si está utilizando una mayor Delphi, StrToDateTime puede requerir un formato específico. A partir de los documentos (D5 en este caso):

The S parameter must be in the MM/DD/YY HH:MM:SS format. Specifying AM or PM as part of the time is optional, as are the seconds. Use 24-hour time (7:45 PM is entered as 19:45, for example) if AM or PM is not specified.

4

Usando VarToDateTime podría ser mucho más simple y simplemente funciona fuera de la caja:

uses Variants; 

newDateTime := VarToDateTime('23/02/2011 12:34:56'); 
+0

Si el formato de fecha y hora es algo así como "06. okt. 2015", entonces incluso StrToDateTime (DateTimeToStr (Now)) falla. Pero VarToDateTime (en lugar de StrToDateTime) funciona bien. Parece ser la mejor opción. –

Cuestiones relacionadas