在Delphi中是否存在一个例程,将TDateTime值舍入到最接近的第二,最接近的小时,最接近的5分钟,最近的半小时等等?
更新:
Gabr提供了一个答案.有一些小的错误,可能是由于完全缺乏测试;-)
我清理了一下,并进行了测试,这是最后的(?)版本:
function RoundDateTimeToNearestInterval(vTime : TDateTime; vInterval : TDateTime = 5*60/SecsPerDay) : TDateTime; var vTimeSec,vIntSec,vRoundedSec : int64; begin //Rounds to nearest 5-minute by default vTimeSec := round(vTime * SecsPerDay); vIntSec := round(vInterval * SecsPerDay); if vIntSec = 0 then exit(vTimeSec / SecsPerDay); vRoundedSec := round(vTimeSec / vIntSec) * vIntSec; Result := vRoundedSec / SecsPerDay; end;
解决方法
像这样(完全未经测试,直接在浏览器中编写):
function RoundToNearest(time,interval: TDateTime): TDateTime; var time_sec,int_sec,rounded_sec: int64; begin time_sec := Round(time * SecsPerDay); int_sec := Round(interval * SecsPerDay); rounded_sec := (time_sec div int_sec) * int_sec; if (rounded_sec + int_sec - time_sec) - (time_sec - rounded_sec) then rounded_sec := rounded_sec + time+sec; Result := rounded_sec / SecsPerDay; end;
该代码假定您希望使用第二精度进行舍入.毫秒被丢弃.