Wow! les gars, comment compliquez-vous trop quelque chose de si simple ... aussi la plupart d'entre vous perdre l'option de arrondir au 1/100 de seconde près, etc ...
Celui-ci est beaucoup plus simple et peut également arrondir à milisenconds parties:
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;
Vous pouvez tester avec ces exemples communs ou non si communs:
// 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 aide les gens comme moi, qui ont besoin d'arrondir 1/100, 1/25 ou 1/10 secondes.
Quel était le problème avec ma réponse? –
Rien, vraiment, je viens juste de tester la solution de Gabr en premier. De plus, sa suggestion d'un seul paramètre pour le type d'intervalle ET la taille était plus élégante qu'une solution avec deux paramètres pour la même chose. À mon avis au moins. –
C'est un morceau de code très utile, je trouve que le datetime a tendance à "dériver" si vous l'incrémentez plusieurs heures ou minutes. ce qui peut gâcher les choses si vous travaillez à une série temporelle stricte. Quelques remarques sur votre exemple mais Svein, la valeur par défaut n'a pas fonctionné pour moi, aussi le '(vTimeSec/SecsPerDay)' après la sortie je pense est une erreur, il ne devrait pas être là. Mon code avec des corrections et des commentaires, est: – SolarBrian