C# 获取时间戳的时段结束时间?(向上取整)

C# 获取时间戳的时段结束时间?(向上取整),c#,datetime,rounding,C#,Datetime,Rounding,我试图创建一个函数,返回给定分辨率的时间戳的句点结束日期时间。例如,如果分辨率为10分钟(存储为时间跨度),我的时间戳为2012-08-14 12:34,则时段结束时间为2012-08-14 12:40。下面的其他例子 Timestamp: 2012-08-14 1:15; Resolution: 01:00:00; Result: 2012-08-14 2:00 Timestamp: 2012-08-14 11:59; Resolution: 00:10:00; Result: 2012-08

我试图创建一个函数,返回给定分辨率的时间戳的句点结束日期时间。例如,如果分辨率为10分钟(存储为时间跨度),我的时间戳为2012-08-14 12:34,则时段结束时间为2012-08-14 12:40。下面的其他例子

Timestamp: 2012-08-14 1:15; Resolution: 01:00:00; Result: 2012-08-14 2:00
Timestamp: 2012-08-14 11:59; Resolution: 00:10:00; Result: 2012-08-14 12:00
Timestamp: 2012-08-14 12:00; Resolution: 00:10:00; Result: 2012-08-14 12:00
Timestamp: 2012-08-14 12:01; Resolution: 00:10:00; Result: 2012-08-14 12:10
我试图遵循(为t-sql编写)但在支持15分钟、60分钟和1天的决议时遇到了麻烦

您知道如何创建一个能够支持这些多个(由运行时确定的)解决方案的动态解决方案吗

编辑 这就是我到目前为止所做的,只要你的分辨率小于60分钟,它就可以工作,但是一旦你的分辨率为1小时,你就可以将分钟除以零,得到一个异常

    public static DateTime ConvertToPeriodEndingTimestamp(TimeSpan resolution, DateTime timestamp)
    {
        var modifiedDate = new DateTime();
        var baseDate = new DateTime(2008, 01, 01, 00, 00, 00);
        var cursor = baseDate;

        var nowToBaseDateDifference = timestamp.Subtract(baseDate).TotalMinutes;

        //SET @Result = DATEADD(MINUTE, (resolution.TotalMinutes * (nowtoBaseDateDifference / resolution.TotalMinutes)) + resolution.TotalMinutes, '20000101')
        modifiedDate =
            baseDate.AddMinutes(((resolution.TotalMinutes*(int)(nowToBaseDateDifference/resolution.TotalMinutes)) +
                                 resolution.TotalMinutes));

        if(timestamp.Minute % resolution.Minutes == 0)
            modifiedDate = modifiedDate.Add(-resolution);

        return modifiedDate;
    }

如果您的时间跨度是一天的因数(864000000000个刻度),则此答案有效


获取时间戳和时间跨度中的刻度数。取二的模数,这将给出周期内到目前为止的刻度数。如果这是零,那么你可以认为这是前一个时期的结束,你已经完成了。否则,减去该值即为周期的开始,然后加上时间跨度中的节拍数即为周期的结束。

如果您的时间跨度是一天的因数(864000000000节拍),则此答案有效


获取时间戳和时间跨度中的刻度数。取二的模数,这将给出周期内到目前为止的刻度数。如果这是零,那么你可以认为这是前一个时期的结束,你已经完成了。否则,减去该值即为周期的开始,然后再加上时间跨度中的刻度数即为周期的结束。

类似的内容?它使用的是
int
,而不是
TimeSpan

public static DateTime TimeRoundUp(DateTime dt, int Interval)
{
    int nextMin = (int)(dt.Minute / Interval);
    int lowerEdge = nextMin * Interval;
    int upperEdge = lowerEdge + Interval;
    if (dt.Minute - lowerEdge < upperEdge - dt.Minute)
    {
        nextMin = lowerEdge - dt.Minute;
    }
    else
    {
        nextMin = upperEdge - dt.Minute;
    }
    if (nextMin > 59)
    {
        nextMin = 60 - dt.Minute;
    }
    dt = dt.AddMinutes(nextMin);
    dt = dt.AddSeconds(-dt.Second); // zero seconds
    return dt;
}
publicstaticdatetime-TimeRoundUp(DateTime-dt,int-Interval)
{
int nextMin=(int)(dt.分钟/间隔);
int lowerEdge=nextMin*间隔;
int upperEdge=下边缘+间隔;
如果(dt.Minute-lowerEdge59)
{
下一分钟=60-dt.分钟;
}
dt=dt.增加分钟数(下一分钟);
dt=dt.AddSeconds(-dt.Second);//零秒
返回dt;
}

我还没有完全测试过它,但它可以给你一个开始。

像这样的东西?它使用的是
int
,而不是
TimeSpan

public static DateTime TimeRoundUp(DateTime dt, int Interval)
{
    int nextMin = (int)(dt.Minute / Interval);
    int lowerEdge = nextMin * Interval;
    int upperEdge = lowerEdge + Interval;
    if (dt.Minute - lowerEdge < upperEdge - dt.Minute)
    {
        nextMin = lowerEdge - dt.Minute;
    }
    else
    {
        nextMin = upperEdge - dt.Minute;
    }
    if (nextMin > 59)
    {
        nextMin = 60 - dt.Minute;
    }
    dt = dt.AddMinutes(nextMin);
    dt = dt.AddSeconds(-dt.Second); // zero seconds
    return dt;
}
publicstaticdatetime-TimeRoundUp(DateTime-dt,int-Interval)
{
int nextMin=(int)(dt.分钟/间隔);
int lowerEdge=nextMin*间隔;
int upperEdge=下边缘+间隔;
如果(dt.Minute-lowerEdge59)
{
下一分钟=60-dt.分钟;
}
dt=dt.增加分钟数(下一分钟);
dt=dt.AddSeconds(-dt.Second);//零秒
返回dt;
}

虽然我还没有完全测试过它,但它可以给您一个开始。

欢迎使用。你试过代码吗?如果是这样,请编辑答案以添加相关代码。提示一下,模
%
运算符是您的朋友。这不是答案,但可以帮助你:这应该会帮助你:欢迎来到SO。你试过代码吗?如果是这样,请编辑答案以添加相关代码。提示一下,模
%
运算符是您的朋友。这不是答案,但可以帮助您:这应该可以帮助您: