有没有任何一种数学方法可以将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
- 数组在以后的任何时候都会被迭代。如果我可以直接在该迭代上计算,而不是自己的迭代,那就更好了。但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));
答案 0 :(得分:15)
向下舍入到一天相当于time.Date
,向四舍五入到最近(在中点上)只是( time + 12hours ).Date
。
为了整理整整一个小时,我无法想到比你的代码更好的代码。如果要四舍五入到最近的小时,您可以将代码应用到time + 30mins
。
可能有一种更快的方法可以舍入到最近的小时:
const Int64 HourInTicks=...;
Int64 timeInTicks=time.Ticks;
Int64 trucatedToHour=timeInTicks-timeInTicks%HourInTicks;
但是我会避免这种情况,除非你真的需要性能,这是不可能的。
(如果您使用当地时间,我的回合最近可能会在本地时间偏移发生变化的日子出现问题)
答案 1 :(得分:13)
要向下舍入到日,您可以使用DateTime.Date Property 要把它缩小到一小时,我担心你必须使用你在你的例子中所做的事情或类似的东西:
d.Date.AddHours(d.Hour)
答案 2 :(得分:2)
我会做以下事情:
private static readonly DateTime Epoch = new DateTime(1970, 1, 1);
public static DateTime Round(this DateTime d, Period p)
{
var ts = d - Epoch;
if (p == Period.Hour)
{
var hours = (long)ts.TotalHours;
return Epoch.AddHours(hours);
}
else if (p == Period.Days)
{
var days = (long)ts.TotalDays;
return Epoch.AddDays(days);
}
// ...
}
答案 3 :(得分:2)
我相信下面的C#代码会将DateTime值四舍五入到最接近的分钟,我认为很容易将它推广到其他单位。
//round to nearest minute; add 30 seconds for rounding to nearest minute
effectiveDateTime = effectiveDateTime.AddSeconds(30);
TimeSpan timeComponent = effectiveDateTime.TimeOfDay;
effectiveDateTime = effectiveDateTime.Date;
effectiveDateTime = effectiveDateTime.AddHours(timeComponent.Hours).
AddMinutes(timeComponent.Minutes);
答案 4 :(得分:1)
不确定这种方法是否有效,但使用字符串格式(在这种情况下减少到几小时)看起来相当不错:
var date = DateTime.UtcNow;
var cutDownDate = Convert.ToDateTime(date.ToString("yyyy-MM-dd hh"));
答案 5 :(得分:0)
答案Is there a better way in C# to round a DateTime to the nearest 5 seconds?包含一种出色的通用DateTime
四舍五入方法。
编辑: 这个答案在更新的问题标题之前,是舍入到最近的而不是向下舍入的算法。