2012-04-11 6 views
8

DateTimeを最も近い30分に丸める簡単な関数がC#でありますか?たとえば

2011-08-11 16:59には、私はその

var time = DateTime.Now; 
var rounded = time.AddMinutes(
     time.Minute>30 ? -(time.Minute-30) : -time.Minute) 

のようなものを言うそして、あなたもあなた自身を行うことができ2011-08-11午前16時30分

+1

基本クラスライブラリにこのような関数はありません。 –

+0

このような機能はありません 参照できる:[http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes] [1] [1]:http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes – Thakur

+0

http://stackoverflow.com/questions/ 1393696/c-sharp-rounding-datetime-objects – Chris

答えて

16

なり延長

public static class TimeHelper { 
    public static DateTime RoundDown (this DateTime time) 
    { 
     return time.AddMinutes(
     time.Minute>30 ? -(time.Minute-30) : -time.Minute); 
    } 
} 

EDIT

この関数は、必要に応じて秒/ミリ秒単位でカットします。ヒントをありがとう。

public static DateTime RoundDown(this DateTime time) 
{ 
    return time.Subtract(
     new TimeSpan(0, 0, time.Minute > 30 ? (time.Minute - 30) : time.Minute, 
      time.Second, time.Millisecond)); 
} 
+2

+1「DateTime.Kind」の値を削除しないソリューション:) –

+0

「分」はコンパイルされません。「DateTime」型には「分」プロパティはありません。 'Minute'に変更するとコンパイルされますが、 'Minute'プロパティは' int 'なので、秒はOPが望むように全体の分数に切り捨てるのではなく、丸めた結果にとどまります。 – devgeezer

+0

ヒントdevgeezerのためのThx。私は自分の答えを更新しました。 – BitKFu

2
DateTime newDateTime = new DateTime(oldDateTime.Year, oldDateTime.Month, oldDateTime.Day 
    ,oldDateTime.Hour, (oldDateTime.Minute/30) * 30, 0); 
0

はそのような機能を利用できる

あなたはを参照することができますがありません:あなたは1に

DateTime RoundUp(DateTime dt, TimeSpan d) 
{ 
    return new DateTime(((dt.Ticks - d.Ticks + 1)/d.Ticks) * d.Ticks + d.Ticks); 
} 

などを自分で作成することができ、必要に応じてHow can I round up the time to the nearest X minutes?

var dt1 = RoundUp(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30)); 
// dt1 == {11/08/2011 16:30:00} 
+0

悲しいが、彼の最も近い30分は '16:30'です – V4Vendetta

+0

@ V4Vendetta私の悪い。今それを修正しました。 – Thakur

17
DateTime RoundDown(DateTime dt, TimeSpan d) 
{ 
    return new DateTime((dt.Ticks/d.Ticks) * d.Ticks); 
} 

例:TimeOfDayTimeSpanであり、そのTotalMinutes性が等倍にdoubleおよびモジュラス演算機能ということであることを、いくつかの数学

var input = DateTime.Now; // or however you get DateTime 
var rounded = input.AddMinutes(-input.TimeOfDay.TotalMinutes % 30d); 

注活用

var dt1 = RoundDown(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30)); 
// dt1 == {11/08/2011 16:30:00} 

var dt2 = RoundDown(DateTime.Parse("2011-08-11 17:00"), TimeSpan.FromMinutes(30)); 
// dt2 == {11/08/2011 17:00:00} 

var dt3 = RoundDown(DateTime.Parse("2011-08-11 17:01"), TimeSpan.FromMinutes(30)); 
// dt3 == {11/08/2011 17:00:00} 
+0

ありがとう!これで丸めの問題が見えますか?私はRoundDownを最も近い分にしようとしており、同じ間隔でランダムに2つの異なる答えを得ています。 – Legend

0

以下:

47.51パーセント30D == 17.51

あなたがゼロ以外の好きな任意の値に30Dを変えることができる16.2%30D == 16.2

768.7パーセント30D == 18.7

。 15分間隔で15分間隔に変更します。 30dから-30dに変更しても、実行したテストの結果は変更されませんでした。

あなたは(すべてのDateTime値のため、この丸め方法を提供する)丸め拡張メソッドを作成することができます。

public static class DateTimeExtensions 
{ 
    public static DateTime Round(this DateTime self, double minutesInInterval) 
    { 
     if (minutesInInterval == 0d) throw new ArgumentOutOfRangeException("minutesInInterval"); 
     return self.AddMinutes(-self.TimeOfDay.TotalMinutes % minutesInInterval); 
    } 
} 
3

最も近い時間帯に丸めより一般的な解決策を:


public static DateTime RoundUp(this DateTime dt, TimeSpan d) 
{ 
    var delta = (d.Ticks - (dt.Ticks % d.Ticks)) % d.Ticks; 
    return new DateTime(dt.Ticks + delta); 
} 

public static DateTime RoundDown(this DateTime dt, TimeSpan d) 
{ 
    var delta = dt.Ticks % d.Ticks; 
    return new DateTime(dt.Ticks - delta); 
} 

public static DateTime RoundToNearest(this DateTime dt, TimeSpan d) 
{ 
    var delta = dt.Ticks % d.Ticks; 
    bool roundUp = delta > d.Ticks/2; 

    return roundUp ? dt.RoundUp(d) : dt.RoundDown(d); 
}

それは次のようになりthis response

var date = new DateTime(2010, 02, 05, 10, 35, 25, 450); // 2010/02/05 10:35:25 
var rounded = date.RoundToNearest(TimeSpan.FromMinutes(30)); // 2010/02/05 10:30:00

より:この方法を使用していました。

0

私はそれをどのように扱ったのですか。以下は、基本メソッドと30分に丸めるオーバーロードです。

関連する問題