function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer;cdecl; varargs; external 'msvcrt.dll'; function FastFormatTime(dt:TDateTime):string; var second :Int64; y,m,d,h,n,s,ms:Word; begin SetLength(Result, 255); DecodeDateTime(dt,y,m,d,h,n,s,ms); sprintf(PChar(Result),'%04d-%02d-%02d %02d:%02d:%02d.%03d',y,m,d,h,n,s,ms); end;
procedure TForm1.btn1Click(Sender: TObject); var i:Integer; str:string; t:int64; begin t:= timeGetTime; for i:=1 to 50000 do begin str :=FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',Now); end; mmo1.Lines.Add('FormatDateTime耗时:' + IntToStr(timeGetTime-t) + ' ' + str); //>100 ms
t:= timeGetTime; for i:=1 to 50000 do begin str :=FastFormatTime(Now); end; mmo1.Lines.Add('FormatDateTime耗时:' + IntToStr(timeGetTime-t) + ' ' + str); //<40ms
function FastFormatTime(dt:TDateTime):string; var second :Int64; y,m,d,h,n,s,ms:Word; begin SetLength(Result, 255); DecodeDateTime(dt,y,m,d,h,n,s,ms); sprintf(PChar(Result),'%04d-%02d-%02d %02d:%02d:%02d.%03d',y,m,d,h,n,s,ms); end;
function FastFormatTime(dt:TDateTime):string; 返回值类型变为ansistring function FastFormatTime(dt:TDateTime):ansistring;
----------------------------------------------
-
procedure FastFormatTime(si: TSystemTime; var result: string); overload;
procedure ToYear(year: Integer; dest: PChar); var r: Integer; begin dest^ := SNumbers[year div 1000]; r := year mod 1000; (dest + 1)^ := SNumbers[r div 100]; r := r mod 100; (dest + 2)^ := SNumbers[r div 10]; (dest + 3)^ := SNumbers[r mod 10]; end;
procedure ToWord(Value: Word; Dest: PChar); begin dest^ := SNumbers[Value div 10]; (dest + 1)^ := SNumbers[Value mod 10]; end;
procedure ToMillisSeconds(Value: Word; Dest: PChar); var r: Integer; begin dest^ := SNumbers[Value div 100]; r := Value mod 100; (dest + 1)^ := SNumbers[r div 10]; (dest + 2)^ := SNumbers[r mod 10]; end;
var len: Integer; p: PDType; begin len := Length(Result); if len < SDateTimeFormatLength then SetLength(Result, SDateTimeFormatLength); p := PDType(result); p.s1 := '-'; p.s2 := '-'; p.space := ' '; p.s3 := ':'; p.s4 := ':'; p.s5 := '.';