• .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;
  • 相关阅读:
    【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
    【bzoj4059】[Cerc2012]Non-boring sequences 分治
    【bzoj4390】[Usaco2015 dec]Max Flow LCA
    【bzoj4127】Abs 树链剖分+线段树
    【bzoj1222】[HNOI2001]产品加工 背包dp
    【bzoj4966】总统选举 随机化+线段树
    protected internal == internal
    框架的一点小随笔
    WPF 的 数据源属性 和 数据源
    Python 运算符重载
  • 原文地址:https://www.cnblogs.com/lwm8246/p/2756255.html
Copyright © 2020-2023  润新知