.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;
原文地址:https://www.cnblogs.com/lwm8246/p/2756255.html