向下舍入到dateTime中的最近边界

时间:2012-01-08 08:29:31

标签: c# algorithm datetime

在类似answerquestion中,DateTime四舍五入到闭合(时间)边界, Math.Round方法不允许通过选择舍入到下边界 有没有办法以相同的方式计算一段时间的下边界?
意思是如果时间是10/2/2012 10:52:30并且选择的时间是一小时:10/2/2012 10:00:00,如果选择的日期是10/2/2012 00: 00:00等等。

2 个答案:

答案 0 :(得分:6)

如果你只需要去一个特定的单位,我可能甚至不愿意使用Math.RoundMath.Floor - 我会选择以下内容:

switch (unitToRoundDownTo)
{
    case Unit.Second:
        return new DateTime(old.Year, old.Month, old.Day,
                            old.Hour, old.Minute, old.Second, old.Kind);
    case Unit.Minute:
        return new DateTime(old.Year, old.Month, old.Day,
                            old.Hour, old.Minute, 0, old.Kind);
    case Unit.Hour:
        return new DateTime(old.Year, old.Month, old.Day, old.Hour, 0, 0, old.Kind);
    case Unit.Day:
        return new DateTime(old.Year, old.Month, old.Day, 0, 0, 0, old.Kind);
    case Unit.Month:
        return new DateTime(old.Year, old.Month, 1, 0, 0, 0, old.Kind);
    case Unit.Year:
        return new DateTime(old.Year, 1, 1, 0, 0, 0, old.Kind);
    default:
        throw new ArgumentOutOfRangeException();
}

如果你需要“最接近的5分钟”等,这不起作用,但是对于单个时间单位来说,理解和调试比试图使算术工作更简单。

或者,作为您所链接问题的接受答案的不同旋转,您可以这样做:

// tickCount is the rounding interval, e.g. TimeSpan.FromMinutes(5).Ticks
DateTime rounded = new DateTime((old.Ticks / tickCount) * tickCount);

请注意,这对于四舍五入到月初或年份无效。

答案 1 :(得分:3)

尝试使用Math.Floor代替Math.Round(与您关联的帖子类似)。