2012-11-09 33 views
14

Bu kod Delphi XE2'de çalışmalıdır çalışmıyor ama StrtoDateTime dönüşümle "geçerli bir tarih ve saat" hatası veriyor:Dönüşüm

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; 

Herhangi bir ipuçları? İç rutinleri dize dize tarih ve saat parçaları belirlemek için bu karakteri kullanır ayrıştırmak çünkü

+2

BTW: DateSeparator sadece Biçim-String '/' değiştirmek için kullanılır. Bunu kullanmak için, ShortDateFormat öğesini 'dd/mmm/yyyy' olarak ayarlamanız gerekir, aksi halde yararsızdır: o) –

cevap

15

bildirilen StrToDateTime. Her ikisinin de uygulanmasına bir göz atın ve StrToDateTime'ın bir şekilde olduğunu anlayacaksınız ... ve VarToDateTime kendi başına belirleyemediğinde işletim sistemine soracaktır.

Bu

Delphi XE3 ile çalışır (aynı zamanda önceki sürümleri ile çalışması gerekir):

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

Aslında, VarToDateTime kullanarak çalışır. Ayrıca, TFormatSettings yapısını kullanma ihtiyacını ortadan kaldırır. Hepsi için Thnx .. – Moore

15

Sen iki sorunu

  1. Sen DateSeparator gibi bir beyaz boşluklar kullanamazsınız var. Eğer bazı özel DateTime-Biçimleri daha iyi VarToDateTime kullanmak yerine gerekir dönüştürmek istiyorsanız ay parçası mmm dize kullandığınızda

  2. StrToDateTime fonksiyon çalışmaz, bu QC 23301