2012-11-09 28 views
14

Mã này nên làm việc trong Delphi XE2, nhưng nó mang lại "không phải là một ngày hợp lệ và thời gian" lỗi trong chuyển đổi StrtoDateTime:chuyển đổi với StrToDateTime và TFormatSettings không hoạt động

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; 

Bất kỳ gợi ý?

+2

BTW: Các DateSeparator chỉ được sử dụng để thay đổi '/' trong Format-String. Để có được nó được sử dụng, bạn phải thiết lập ShortDateFormat để 'dd/mmm/yyyy' nếu không nó là vô ích: o) –

Trả lời

15

Nếu bạn muốn chuyển đổi một số DateTime-định dạng đặc biệt bạn nên sử dụng tốt hơn VarToDateTime thay vì StrToDateTime. Chỉ cần có một cái nhìn tại việc thực hiện của cả hai và bạn sẽ nhận ra, rằng StrToDateTime là bằng cách nào đó ... và VarToDateTime sẽ yêu cầu hệ điều hành nếu nó không thể tự xác định.

này làm việc với Delphi XE3 (nhưng cũng nên làm việc với các phiên bản trước đó):

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 thực tế, bằng cách sử dụng VarToDateTime hoạt động. Hơn nữa, nó loại bỏ sự cần thiết phải sử dụng cấu trúc TFormatSettings. Thnx cho tất cả .. – Moore

15

Bạn có hai vấn đề

  1. Bạn không thể sử dụng một khoảng trắng như DateSeparator, bởi vì thói quen nội bộ để phân tích chuỗi sử dụng nhân vật này để xác định ngày và thời gian các bộ phận của chuỗi.

  2. Chức năng StrToDateTime không hoạt động khi những tháng phần sử dụng chuỗi mmm, điều này được báo cáo trong năm này QC 23301

Các vấn đề liên quan