将日期时间剪切/舍入为整数,即小时/天?

时间:2011-11-10 14:22:30

标签: c#

有没有任何一种数学方法可以将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));

6 个答案:

答案 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四舍五入方法。

编辑: 这个答案在更新的问题标题之前,是舍入到最近的而不是向下舍入的算法。