9

例えば:

2011-08-1116:59は2011-08-1116:30になります

4

7 に答える 7

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

例:

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}
于 2012-04-11T05:23:05.857 に答える
16

私はそのようなことを言うでしょう

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

そして、あなたはあなた自身の拡張をすることさえできます

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

編集

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

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));
}
于 2012-04-11T05:08:40.920 に答える
4

最も近い期間に丸めるより一般的なソリューション:


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);
}

これは次のように使用されます。

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

この応答の詳細。

于 2013-11-18T15:07:27.860 に答える
2
DateTime newDateTime = new DateTime(oldDateTime.Year, oldDateTime.Month, oldDateTime.Day
  ,oldDateTime.Hour, (oldDateTime.Minute / 30) * 30, 0);
于 2012-04-11T05:09:10.063 に答える
1

いくつかの数学を利用する

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

TimeOfDayはaTimeSpanであり、そのTotalMinutesプロパティはadoubleであり、モジュラス演算子は次のようにdoubleで機能することに注意してください。

47.51%30d == 17.51

16.2%30d == 16.2

768.7%30d == 18.7

30dをゼロ以外の任意の値に変更できます。たとえば、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);
    }
}
于 2012-04-11T06:04:43.403 に答える
0

そのような機能はありません

参照できます:時間を最も近いX分に切り上げるにはどうすればよいですか?

必要に応じて、自分で作成できます

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

例えば:

var dt1 = RoundUp(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30));
// dt1 == {11/08/2011 16:30:00}
于 2012-04-11T05:10:34.817 に答える
0

これが私がそれをどのように扱ったかです。以下は、基本的な方法と、30分単位で丸めるオーバーロードです。

public static DateTime RoundMinutes(this DateTime value)
{
    return RoundMinutes(value, 30);
}

public static DateTime RoundMinutes(this DateTime value, int roundMinutes)
{
    DateTime result = new DateTime(value.Ticks);

    int minutes = value.Minute;
    int hour = value.Hour;
    int minuteMod = minutes % roundMinutes;

    if (minuteMod <= (roundMinutes / 2))
    {
        result = result.AddMinutes(-minuteMod);
    }
    else
    {
        result = result.AddMinutes(roundMinutes - minuteMod);
    }

    return result;
}
于 2017-02-01T20:50:35.997 に答える