2012-11-09 7 views
14

Questo codice dovrebbe funzionare in Delphi XE2, ma dà "non è una data valida e l'ora" Errore nella conversione StrtoDateTime:conversione con StrToDateTime e TFormatSettings non funziona

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; 

Eventuali suggerimenti?

+2

BTW: Il DateSeparator viene utilizzato solo per cambiare il '/' in Format-String. Per utilizzarlo è necessario impostare ShortDateFormat su 'gg/mm/aaaa' altrimenti non è utile: o) –

risposta

15

Se si desidera convertire una DateTime-formati speciali si dovrebbe utilizzare meglio VarToDateTime invece di StrToDateTime. Basta dare un'occhiata all'implementazione di entrambi e si riconoscerà che StrToDateTime è in qualche modo ... e VarToDateTime chiederà al sistema operativo se non è in grado di determinare da solo.

questo funziona con Delphi XE3 (ma dovrebbe funzionare anche con le versioni precedenti):

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; 
+1

Infatti, utilizzando VarToDateTime funziona. Inoltre, elimina la necessità di utilizzare la struttura TFormatSettings. Thnx per tutti – Moore

15

avete due problemi

  1. Non è possibile utilizzare uno spazio bianco come DateSeparator, perché le routine interne per analizzare la stringa utilizza questo carattere per determinare la data e l'ora parti della stringa.

  2. La funzione StrToDateTime non funziona quando i mesi parte utilizzano la stringa mmm, questo è riportato in questo QC 23301