2016-05-25 6 views
2

Ich habe eine ähnliche Frage here gefunden, aber es hat nichts damit zu tun, was ich versuche zu tun. Ich habe viel im Internet recherchiert und festgestellt, dass Delphi so funktioniert, wie es geplant oder geplant ist, wobei die Zeit ausgelassen wird, wenn die Zeit Null ist. Ich habe eine Anwendung, die das Datum & Zeit in einer ListView anzeigt, und wenn die Zeit Mitternacht ist, zeigt es nicht 00:00:00, und daher die Ergebnisse ungleich und fehl am Platz zu machen.Delphi: DateTimeToStr Ausgabe mit Null Zeit (Mitternacht)

Die Art, wie ich um diese bekommen haben, die noch locale unabhängig ist, ist eine Mikrosekunde bis zu dem Zeitpunkt an, Beispielcode siehe:

program Test11; 

{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils, Winapi.Windows; 

begin 
    try 
    Writeln(DateTimeToStr(44167, TFormatSettings.Create(GetThreadLocale))); 
    Writeln(DateTimeToStr(44167.00000001, TFormatSettings.Create(GetThreadLocale))); 
    Readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 

end. 

und nachfolgende Ausgabe:

02/12/2020 
02/12/2020 00:00:00 

Die Frage Ist - gibt es einen besseren, programmatischeren Weg, dies zu erreichen?

Lauf Delphi XE6

+0

@nolaspeaker - das impliziert dann ein Gebietsschema - ich brauche meine Anwendung, um unabhängig zu sein. – KeyszerS

+0

@nolaspeaker - Ich schätze die zusätzlichen Kommentare, aber ich habe die Antwort unten akzeptiert. hh: nn: ss.zzz gibt immer noch ein Gebietsschema-Format an. Beispiel: Das Gebietsschema en-us zeigt Mitternacht als 12:00:00 Uhr an - was Ihr Beispiel nicht ausgegeben hätte. – KeyszerS

+1

FWIW können Sie einfach 'TFormatSettings.Create' aufrufen, ruft intern' GetThreadLocale' auf Windows auf - Bonus-Effekt: plattformübergreifende Kompatibilität –

Antwort

8

können Sie verwenden FormatDateTime Funktion für mehr Kontrolle über Datum Zeit Formatierung.

FormatDateTime('ddddd tt', 44167, TFormatSettings.Create); 

Hinweis: Es gibt keine Notwendigkeit TFormatSettings.Create(GetThreadLocale) mit locale Parameter zu nennen, weil schlicht TFormattSettings.Create Anruf intern wird GetThreadLocale auf Windows-Plattform verwenden.

-1

Dies ist "normales" Verhalten der VCL. Sehen Sie sich den zugehörigen Code von System.SysUtils an (es stammt aus Seattle, aber ich denke, seit XE6 hat sich nicht viel geändert).

function DateTimeToStr(const DateTime: TDateTime; 
    const AFormatSettings: TFormatSettings): string; 
begin 
    DateTimeToString(Result, '', DateTime, AFormatSettings); 
end; 

procedure DateTimeToString(var Result: string; const Format: string; 
    DateTime: TDateTime; const AFormatSettings: TFormatSettings); 
begin 
    ... 
    if Format <> '' then AppendFormat(Pointer(Format)) else AppendFormat('C'); 
    ... 

//This is another related part of DateTimeToString. 
case Token of 
    'C': 
    begin 
     GetCount; 
     AppendFormat(Pointer(AFormatSettings.ShortDateFormat)); 
     GetTime; 
     if (Hour <> 0) or (Min <> 0) or (Sec <> 0) or (MSec <> 0) then 
     begin 
     AppendChars(' ', 1); 
     AppendFormat(Pointer(AFormatSettings.LongTimeFormat)); 
     end; 
    end; 

Wenn der Zeitanteil von datetime gleich null ist, dann wird nur das Datum in der Ergebniszeichenfolge enthalten sein.

Wenn Sie datetime immer im Einzelformat anzeigen möchten, verwenden Sie besser FormatDateTime, wie von anderen Antworten vorgeschlagen.

+0

Die Frage erklärt bereits, dass * Ich habe festgestellt, dass Delphi funktioniert wie vorgesehen oder beabsichtigt *. Der Großteil dieser Antwort wiederholt das einfach. Und dann bezieht sich der letzte Absatz auf die andere Antwort. Dies scheint eher ein Kommentar als eine Antwort zu sein. –

Verwandte Themen