【问题标题】:DotNet Roundoff datetime to last 15 minutes [duplicate]DotNet 舍入日期时间持续 15 分钟 [重复]
【发布时间】:2013-05-28 13:31:22
【问题描述】:

是否有将日期时间四舍五入到上一季度的功能?

示例...

08:03:00 becomes 08:00:00

08:14:00 becomes 08:00:00

08:15:00 stays   08:15:00

08:16:00 becomes 08:15:00

08:29:00 becomes 08:15:00

08:45:00 stays   08:45:00 

08:55:00 becomes 08:45:00

09:01:00 becomes 09:00:00

我已经写了下面的函数,但它会返回下一个季度 ...

private DateTime RoundUpToPreviousQuarter(DateTime date, TimeSpan d)
{
      return new DateTime(((date.Ticks + d.Ticks - 1) / d.Ticks) * d.Ticks);
}

// call the method
this.RoundUp(time, TimeSpan.FromMinutes(15));

任何意见表示赞赏。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    将模 15 应用于 datetime Minute 属性并从同一属性中减去该值

    DateTime dt = new DateTime(2013,5,28, 15, 59,0);
    dt = dt.AddMinutes(-(dt.Minute % 15));
    

    在这个例子中,我创建了一个零秒的日期时间。如果您还需要删除秒数

    DateTime dt = new DateTime(2013,5,28, 15, 59,45);
    dt = dt.AddMinutes(-(dt.Minute % 15)).AddSeconds(-dt.Second);
    

    【讨论】:

    • 那么秒呢?他们会保持不变,我怀疑 OP 想要这样的舍入。
    • 不需要秒数。只有几分钟。
    【解决方案2】:

    改变你的方法:

    private DateTime RoundUpToPreviousQuarter(DateTime date, TimeSpan d)
    {
        return new DateTime(((date.Ticks) / d.Ticks) * d.Ticks);
    }
    

    检查了它对我有用。

    【讨论】:

    • 将在 08:45:00 失败
    • 这包含一个 Off By One 错误。应该是(date.Ticks / d.Ticks) * d.Ticks。见stackoverflow.com/a/10100259
    • @SergeyS 现在已更改,使其不会在 08:45:00 内失败
    • 如果方法接受变量 TimeSpan 进行舍入,为什么该方法称为 RoundUpToPREVIOUSQUARTER?像 RoundUp 这样的名字会更合适
    猜你喜欢
    • 2014-12-07
    • 2013-10-17
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多