我想将日期/时间舍入到图表应用程序的最近区间.我想要一个像下面这样的扩展方法签名,以便可以在任何精度级别上实现舍入:
static DateTime Round(this DateTime date, TimeSpan span);
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果我通过十分钟的时间跨度,它将四舍五入到最接近的十分钟间隔.我不能理解我的实施,并希望你们中的一个人之前会写过或使用类似的东西.
我认为楼层,天花板或最近的实施都可以.
有任何想法吗?
编辑:感谢@tvanfosson和@ShuggyCoUk,实现如下:
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 - …Run Code Online (Sandbox Code Playgroud) 将DateTime对象修剪为特定精度的最佳方法是什么?例如,如果我的DateTime值为'2008-09-29 09:41:43',但我只想要精确到分钟,有没有更好的方法来做到这一点?
private static DateTime TrimDateToMinute(DateTime date)
{
return new DateTime(
date.Year,
date.Month,
date.Day,
date.Hour,
date.Minute,
0);
}
Run Code Online (Sandbox Code Playgroud)
我真正想要的是让它变量,以便我可以将其精度设置为秒,分钟,小时或日.
有没有任何一种数学方法可以将DateTime减少到精确的小时,一天左右?类似于小数点的圆形到int.
Period.Day
如果原始值是2011-01-01 13:00:00,它最终会进入2011-01-01 00:00:00
如果是Period.Hour
如果原始值是2011-03-11 13:32:00,它最终会进入2011-03-11 13:00:00
我想下面的事情.这当然可以正常工作,但是range后来无论如何都会重复使用-array.如果我可以直接在该迭代上计算,而不是自己的迭代,那就更好了.但someType不能放入该迭代(它取决于someType).
if (someType == Period.Day)
range.ForEach(d => d.time = new DateTime(d.time.Year, d.time.Month, d.time.Day,0,0,0));
if (someType == Period.Hour)
range.ForEach(d => d.time = new DateTime(d.time.Year, d.time.Month, d.time.Day, d.time.Hour, 0, 0));
Run Code Online (Sandbox Code Playgroud)