Chcę zaokrąglić daty / godziny do najbliższego przedziału dla aplikacji do tworzenia wykresów. Chciałbym mieć podpis metody rozszerzenia, jak poniżej, aby można było uzyskać zaokrąglenie dla dowolnego poziomu dokładności:
static DateTime Round(this DateTime date, TimeSpan span);
Chodzi o to, że jeśli przejdę w przedziale czasowym dziesięciu minut, zaokrągli to do najbliższych dziesięciu minut. Nie mogę się skupić na implementacji i mam nadzieję, że któryś z was napisał lub użył czegoś podobnego wcześniej.
Myślę, że podłoga, sufit lub najbliższa realizacja są w porządku.
Jakieś pomysły?
Edycja: Dzięki @tvanfosson i @ShuggyCoUk implementacja 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 tak się nazywa:
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));
...
Twoje zdrowie!
Odpowiedzi:
Piętro
Zaokrąglij (w górę na środku)
Sufit
źródło
return new DateTime(ticks * span.Ticks, date.Kind);
Pozwoli ci to zaokrąglić do dowolnego podanego przedziału. Jest to również nieco szybsze niż dzielenie, a następnie mnożenie kleszczy.
źródło
Należy również jasno określić, czy chcesz, aby zaokrąglenie:
Jest całkiem prawdopodobne, że naprawdę zależy ci tylko na pierwszym punkcie, ale w tych `` prostych '' pytaniach wynikowe zachowanie może mieć daleko idące konsekwencje, ponieważ używasz go w prawdziwym świecie (często w odstępach czasu bliskich zeru)
Rozwiązanie tvanfosson obejmuje wszystkie przypadki wymienione w 1. Przykład punktu środkowego jest przesunięty w górę. Wątpliwe jest, aby byłby to problem związany z zaokrąglaniem czasu.
źródło
Po prostu użyj znaczników, używając ich do podzielenia, podłogi / sufitu / zaokrąglenia wartości i pomnóż ją z powrotem.
źródło
Jeśli chcesz zaokrąglić godzinę do wartości maksymalnej
źródło