DateTime オブジェクトの丸め 質問する

DateTime オブジェクトの丸め 質問する

チャート作成アプリケーションで、日付/時刻を最も近い間隔に丸めたいと考えています。任意の精度レベルで丸めを実行できるように、次のような拡張メソッド シグネチャが必要です。

static DateTime Round(this DateTime date, TimeSpan span);

アイデアとしては、10 分間のタイムスパンを渡すと、最も近い 10 分間隔に丸められるというものです。実装がよくわかりませんが、皆さんのうちの誰かが以前に同様のものを書いたり使用したりしたことがあることを願っています。

下限、上限、または最も近い実装のいずれでも問題ないと思います。

何か案は?

編集: @tvanfosson と @ShuggyCoUk のおかげで、実装は次のようになります。

public static class DateExtensions {
    public static DateTime Round(this DateTime date, TimeSpan span) {
        long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;
        return new DateTime(ticks * span.Ticks);
    }
    public static DateTime Floor(this DateTime date, TimeSpan span) {
        long ticks = (date.Ticks / span.Ticks);
        return new DateTime(ticks * span.Ticks);
    }
    public static DateTime Ceil(this DateTime date, TimeSpan span) {
        long ticks = (date.Ticks + span.Ticks - 1) / span.Ticks;
        return new DateTime(ticks * span.Ticks);
    }
}

そして、次のように呼ばれます:

DateTime nearestHour = DateTime.Now.Round(new TimeSpan(1,0,0));
DateTime minuteCeiling = DateTime.Now.Ceil(new TimeSpan(0,1,0));
DateTime weekFloor = DateTime.Now.Floor(new TimeSpan(7,0,0,0));
...

乾杯!

ベストアンサー1

long ticks = date.Ticks / span.Ticks;

return new DateTime( ticks * span.Ticks, date.Kind );

切り上げ(中間点を切り上げる)

long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;

return new DateTime( ticks * span.Ticks, date.Kind );

シーリング

long ticks = (date.Ticks + span.Ticks - 1)/ span.Ticks;

return new DateTime( ticks * span.Ticks, date.Kind );

おすすめ記事