Chcę zaokrąglić daty/czas do najbliższego przedziału dla aplikacji do tworzenia wykresów. Chciałbym podpisu metodę rozszerzenia jak następuje tak, że zaokrąglanie można osiągnąć na każdym poziomie dokładności:Zaokrąglanie DateTime objects
static DateTime Round(this DateTime date, TimeSpan span);
Chodzi o to, że jeśli przejdzie w przedziale czasu od dziesięciu minut, to zaokrąglić do najbliższej Dziesięć minut interwału. Nie mogę zrozumieć mojej implementacji i mam nadzieję, że któryś z was napisał wcześniej lub użył czegoś podobnego.
Myślę, że albo podłoga, sufit, albo najbliższe wdrożenie jest w porządku.
Wszelkie pomysły?
Edit: Dzięki @tvanfosson & @ShuggyCoUk, realizacja wygląda następująco:
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);
}
}
i nazywa się tak:
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!
Niektóre z tutejszych implementacjach może pomóc też: http://stackoverflow.com/questions/766626/is-there- a-better-way-in-c-to-round-a-datetime-to-the-nearest-5-seconds –
możliwy duplikat [Czy istnieje lepszy sposób przycinania DateTime do określonej dokładności?] (http: //stackoverflow.com/questions/152774/is-there-a-better-way-to-trim-a-datetime-to-a-specific-precision) –
Nie zapomnij dodać oryginalnego DateTimeKind do nowo utworzonej daty ex : new DateTime (ticks * span.Ticks, date.Kind); –