Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rounding DateTime objects

Tags:

c#

algorithm

I want to round dates/times to the nearest interval for a charting application. I'd like an extension method signature like follows so that the rounding can be acheived for any level of accuracy:

static DateTime Round(this DateTime date, TimeSpan span); 

The idea is that if I pass in a timespan of ten minutes, it will round to the nearest ten minute interval. I can't get my head around the implementation and am hoping one of you will have written or used something similar before.

I think either a floor, ceiling or nearest implementation is fine.

Any ideas?

Edit: Thanks to @tvanfosson & @ShuggyCoUk, the implementation looks like this:

public static class DateExtensions {     public static DateTime Round(this DateTime date, TimeSpan span) {         long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;         return new DateTime(ticks * span.Ticks);     }     public static DateTime Floor(this DateTime date, TimeSpan span) {         long ticks = (date.Ticks / span.Ticks);         return new DateTime(ticks * span.Ticks);     }     public static DateTime Ceil(this DateTime date, TimeSpan span) {         long ticks = (date.Ticks + span.Ticks - 1) / span.Ticks;         return new DateTime(ticks * span.Ticks);     } } 

And is called like so:

DateTime nearestHour = DateTime.Now.Round(new TimeSpan(1,0,0)); DateTime minuteCeiling = DateTime.Now.Ceil(new TimeSpan(0,1,0)); DateTime weekFloor = DateTime.Now.Floor(new TimeSpan(7,0,0,0)); ... 

Cheers!

like image 305
grenade Avatar asked Sep 08 '09 12:09

grenade


1 Answers

Floor

long ticks = date.Ticks / span.Ticks;  return new DateTime( ticks * span.Ticks, date.Kind ); 

Round (up on midpoint)

long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;  return new DateTime( ticks * span.Ticks, date.Kind ); 

Ceiling

long ticks = (date.Ticks + span.Ticks - 1)/ span.Ticks;  return new DateTime( ticks * span.Ticks, date.Kind ); 
like image 91
tvanfosson Avatar answered Sep 28 '22 19:09

tvanfosson