delphi DateTimeToStr函数专用优化版


为了在日志文件中写入标准格式的时间。要将时间(Now() 转换到字符格式 " YYYY-MM-DD hh:mm:ss zzz"

就编写了此函数,delphi系统自身也带了转换函数 formatDateTime('YYYY-MM-DD hh:mm:ss zzz',Now())

也可以实现此功能。考虑到我这个是固定格式的转换函数,作进一步的优化。

//实际测试效果

运行 1,000,000 次 FormatDateTime()===>2825ms

 sfNowToBuf() ==>545

procedure sfNowToBuf(const OutBuf:PChar;BufSize:Integer);

const
 strDay:string =
 '010203040506070809101112131415161718192021222324252627282930' +
 '313233343536373839404142434445464748495051525354555657585960' +
 '6162636465666768697071727374757677787980'  +
 '81828384858687888990919293949596979899';
 str10:string = '0123456789';
var
 Year,Month,Day,HH,MM,SS,ZZZ:WORD;
 P:PChar;
 I,J:Integer;
 SystemTime: TSystemTime;
 lvBuf:array[0..22] of char;
begin
 if BufSize <= 0 then
 Exit;

 P := @lvBuf[0];// OutBuff;
 for I := 0 to BufSize - 1 do P[I] := '0';

 GetLocalTime(SystemTime);
 Year  := SystemTime.wYear;
 Month := SystemTime.wMonth;
 Day  := SystemTime.wDay;
 HH  := SystemTime.wHour;
 MM  := SystemTime.wMinute;
 SS  := SystemTime.wSecond;
 ZZZ  := SystemTime.wMilliseconds;

 (*  2012-11-04 17:59
 ZZZ := 0;
 HH  := 0;
 MM  := 0;
 SS := 0;
 *)

 //Year
 I := Year div 1000;
 J := Year mod 1000;
 P^ := str10[I + 1];Inc(P);
 I := J div 100;
 P^ := str10[I + 1];Inc(P);
 I := J mod 100;
 if I > 0 then
 begin
 P^ := strDay[(I - 1) * 2 + 1];Inc(P);
 P^ := strDay[(I - 1) * 2 + 2];Inc(P);
 P^ := '-';Inc(P);
 end
 else begin
 P^ := '0';Inc(P);
 P^ := '0';Inc(P);
 P^ := '-';Inc(P);
 end;

 //Month

 P^ := strDay[(Month - 1) * 2 + 1];Inc(P);
 P^ := strDay[(Month - 1) * 2 + 2];Inc(P);
 P^ := '-';Inc(P);
 

 //Day
 P^ := strDay[(Day - 1) * 2 + 1];Inc(P);
 P^ := strDay[(Day - 1) * 2 + 2];Inc(P);
 P^ := #32;Inc(P);

 //HH
 if HH > 0 then
 begin
 P^ := strDay[(HH - 1) * 2 + 1];Inc(P);
 P^ := strDay[(HH - 1) * 2 + 2];Inc(P);
 end
 else begin
 P^ := #48;Inc(P);
 P^ := #48;Inc(P);
 end;
 P^ := ':';Inc(P);

 //MM
 if MM > 0 then
 begin
 P^ := strDay[(MM - 1) * 2 + 1];Inc(P);
 P^ := strDay[(MM - 1) * 2 + 2];Inc(P);
 end
 else begin
 P^ := #48;Inc(P);
 P^ := #48;Inc(P);
 end;
 P^ := ':';Inc(P);

 //SS
 if SS > 0 then
 begin
 P^ := strDay[(SS - 1) * 2 + 1];Inc(P);
 P^ := strDay[(SS - 1) * 2 + 2];Inc(P);
 end
 else begin
 P^ := #48;Inc(P);
 P^ := #48;Inc(P);
 end;
 P^ := #32;Inc(P);

 //ZZZ
 Year  := ZZZ div 100;
 Month := ZZZ mod 100;
 P^ := str10[Year + 1];Inc(P);
 if Month > 0 then
 begin
 P^ := strDay[(Month - 1) * 2 + 1];Inc(P);
 P^ := strDay[(Month - 1) * 2 + 2];
 end
 else begin
 P^ := '0';Inc(P);
 P^ := '0';
 end;

 if BufSize >23 then BufSize := 23;
 P := OutBuf;
 for I := 0 to BufSize - 1 do P[I] :=  lvBuf[I]
end;

联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678