2012-11-09 11 views
14

Kod ten powinien działać w Delphi XE2, ale daje „nie jest prawidłową datę i czas” błąd w konwersji StrtoDateTime:Konwersja z StrToDateTime i TFormatSettings nie działa

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; 

Wszelkie wskazówki?

+2

BTW: The DateSeparator służy jedynie zmianę '/' w formacie string. Aby go użyć, musisz ustawić ShortDateFormat na "dd/mmm/yyyy", w przeciwnym razie jest to bezużyteczne: o) –

Odpowiedz

15

Jeśli chcesz przekonwertować jakiś specjalny DateTime formatach należy lepiej wykorzystywać VarToDateTime zamiast StrToDateTime. Wystarczy rzucić okiem na implementację obu, a zauważysz, że StrToDateTime jest jakoś ... a VarToDateTime zapyta system operacyjny, czy sam nie może tego ustalić.

ten współpracuje z Delphi XE3 (ale powinny również działać z wcześniejszymi wersjami):

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

Inb fact, używając VarToDateTime działa. Co więcej, eliminuje potrzebę korzystania ze struktury TFormatSettings. Thnx dla wszystkich .. – Moore

15

Masz dwie kwestie

  1. Nie można używać białych znaków jako DateSeparator, ponieważ wewnętrzne procedury do analizowania ciąg używa tego znaku w celu ustalenia daty i godziny części łańcucha.

  2. Funkcja StrToDateTime nie działa, gdy miesiąc część użyć ciągu mmm ta jest opisana w tej QC 23301