Saya ingin membulatkan tanggal / waktu ke interval terdekat untuk aplikasi charting. Saya ingin tanda tangan metode ekstensi seperti berikut sehingga pembulatan dapat dicapai untuk tingkat akurasi apa pun:
static DateTime Round(this DateTime date, TimeSpan span);
Idenya adalah jika saya lewat dalam rentang waktu sepuluh menit, itu akan membulatkan ke interval sepuluh menit terdekat. Saya tidak bisa memahami penerapannya dan saya berharap salah satu dari Anda akan menulis atau menggunakan sesuatu yang serupa sebelumnya.
Saya pikir baik lantai, langit-langit atau implementasi terdekat baik-baik saja.
Ada ide?
Sunting: Berkat @tvanfosson & @ShuggyCoUk, implementasinya terlihat seperti ini:
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);
}
}
Dan disebut seperti itu:
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));
...
Bersulang!