(復活のために申し訳ありませんが、私はそれは古いです認識し、質問に答え - ちょうどGoogleのためにいくつかの余分なコードを追加)
私はJayMcClellan's answerで始まったが、その後、私はそれがより一般的になりたかった、に丸めます任意の間隔(わずか5秒ではない)。だから私はチックにMath.Round
を使用し、任意の間隔を取ることができる拡張メソッドに入れて、丸めロジック(バンカーの丸めとゼロから離れる)を変更するオプションを提供するものにJayのメソッドを残してしまいました。
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval, MidpointRounding roundingType) {
return new TimeSpan(
Convert.ToInt64(Math.Round(
time.Ticks/(decimal)roundingInterval.Ticks,
roundingType
)) * roundingInterval.Ticks
);
}
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval) {
return Round(time, roundingInterval, MidpointRounding.ToEven);
}
public static DateTime Round(this DateTime datetime, TimeSpan roundingInterval) {
return new DateTime((datetime - DateTime.MinValue).Round(roundingInterval).Ticks);
}
それは裸の効率化のための任意の賞を獲得しませんが、私はそれが読みやすく、直感的に使用見つける:私はこれは同様に他の誰かに便利です、ここの場合で投稿しています。使用例:
new DateTime(2010, 11, 4, 10, 28, 27).Round(TimeSpan.FromMinutes(1)); // rounds to 2010.11.04 10:28:00
new DateTime(2010, 11, 4, 13, 28, 27).Round(TimeSpan.FromDays(1)); // rounds to 2010.11.05 00:00
new TimeSpan(0, 2, 26).Round(TimeSpan.FromSeconds(5)); // rounds to 00:02:25
new TimeSpan(3, 34, 0).Round(TimeSpan.FromMinutes(37); // rounds to 03:42:00...for all your round-to-37-minute needs
これは、59秒で最も近い5に丸められて60になります。これは、DateTimeコンストラクタに '秒'パラメータとして渡すことはできません。この方法で、あなたはその落とし穴を避けます。 –
ええ、それは良い点です - 私は自分のコードでその問題を逃しました... – Damovisa
自分自身の答えを批判する潜在的な落とし穴の1つは、DateTimeがうるう秒をどのように考慮しているかわかりません。ティックカウントは、0001年1月1日の午前0時00分00秒から測定されます。その時以降の閏秒の数とDateTimeがそれらを考慮するかどうかによって、結果のSeconds値は5の倍数ではないことがあります。 – JayMcClellan