In Delphi: How do I round a TDateTime to closest second, minute, five-minute etc?

前端 未结 7 1041
余生分开走
余生分开走 2021-01-02 00:23

Does there exist a routine in Delphi that rounds a TDateTime value to the closest second, closest hour, closest 5-minute, closest half hour etc?

UPDATE:

Gab

相关标签:
7条回答
  • 2021-01-02 01:19

    Wow! guys, how do you complicate too much something so simple... also most of you loose the option to round to nearest 1/100 second, etc...

    This one is much more simple and can also round to milisenconds parts:

    function RoundToNearest(TheDateTime,TheRoundStep:TDateTime):TdateTime;
        begin
             if 0=TheRoundStep
             then begin // If round step is zero there is no round at all
                       RoundToNearest:=TheDateTime;
                  end
             else begin // Just round to nearest multiple of TheRoundStep
                       RoundToNearest:=Round(TheDateTime/TheRoundStep)*TheRoundStep;
                  end;
        end;
    

    You can just test it with this common or not so common examples:

    // Note: Scroll to bottom to see examples of round to 1/10 of a second, etc
    
    // Round to nearest multiple of one hour and a half (round to 90'=1h30')
    ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(1,30,0,0))
                              )
               );
    
    // Round to nearest multiple of one hour and a quarter (round to 75'=1h15')
    ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(1,15,0,0))
                              )
               );
    
    // Round to nearest multiple of 60 minutes (round to hours)
    ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(1,0,0,0))
                              )
               );
    
    // Round to nearest multiple of 60 seconds (round to minutes)
    ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(0,1,0,0))
                              )
               );
    
    // Round to nearest multiple of second (round to seconds)
    ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(0,0,1,0))
                              )
               );
    
    // Round to nearest multiple of 1/100 seconds
    ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,141)
                                             ,EncodeTime(0,0,0,100))
                              )
               );
    
    // Round to nearest multiple of 1/100 seconds
        ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(0,0,0,100))
                              )
               );
    
    // Round to nearest multiple of 1/10 seconds
        ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,151)
                                             ,EncodeTime(0,0,0,10))
                              )
               );
    
    // Round to nearest multiple of 1/10 seconds
        ShowMessage(FormatDateTime('hh:nn:ss.zzz'
                              ,RoundToNearest(EncodeTime(15,31,37,156)
                                             ,EncodeTime(0,0,0,10))
                              )
               );
    

    Hope this helps people like me, that need to round to 1/100, 1/25 or 1/10 seconds.

    0 讨论(0)
提交回复
热议问题