1

我正在尝试创建一个函数,该函数针对给定的分辨率返回时间戳的期间结束日期时间。例如,如果分辨率为 10 分钟(存储为 TimeSpan),我的时间戳为 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;
    }
4

2 回答 2

1

如果您的时间跨度是一天的因子(864000000000 滴答声),则此答案有效。

获取时间戳和时间跨度中的刻度数。取两者的模数,这将为您提供该周期内到目前为止的刻度数。如果这是零,那么你可以认为这是上一期的结束,你就完成了。否则,减去它以给出周期的开始,然后加上时间跨度中的刻度数以给出周期的结束。

于 2012-08-14T23:34:01.860 回答
0

像这样的东西?它使用一个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;
}

虽然我没有彻底测试过它,但它可以让你开始。

于 2012-08-14T23:34:42.800 回答