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時間になるとすぐに、分を0で割り、例外を取得します.

    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

この回答は、タイムスパンが 1 日の係数 (864000000000 ティック) の場合に機能します。

タイムスタンプとタイムスパンのティック数を取得します。2 つのモジュラスを取得すると、期間内のこれまでのティック数が得られます。これがゼロの場合、これが前の期間の終わりであると見なすことができ、完了です。それ以外の場合は、それを減算して期間の開始を示し、タイムスパンのティック数を加算して期間の終了を示します。

于 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 に答える