15

適切な丸めメカニズムを探していましたが、まさに必要なものが見つからないようです。

切り上げと切り捨てを別々に行う必要があり、すでに切り上げられている場合も考慮に入れる必要があります。

次の丸めを行う必要があります

5:00 -> RoundDown() -> 5:00
5:04 -> RoundDown() -> 5:00
5:09 -> RoundDown() -> 5:00
5:10 -> RoundDown() -> 5:10

4:00 -> RoundUp() -> 4:00
4:50 -> RoundUp() -> 4:50
4:51 -> RoundUp() -> 5:00
4:56 -> RoundUp() -> 5:00 

基本的には、RoundUp() または RoundDown() を最も近い 10 分に明示的に指定する必要がありますが、すでに 10 分の倍数になっている場合は、そのままにしておく必要があります。また、丸め手順に影響を与えないように秒を切り捨てたいと思います

4:50:45 -> 4:50:00 -> RoundUp() -> 4:50

これを達成するための便利なコードはありますか。

私はこのコードをどこかで見つけましたが、すでに 10 の倍数であり、丸めを必要としないため、そのままにしておくのではなく、5:00 -> RoundUp() -> 5:10 に丸めます。また、秒数がどのように影響するかわかりません

public static DateTime RoundDateTime(this DateTime dt, int minutes, RoundingDirection direction)
{
    TimeSpan t;
    switch (direction)
    {
        case RoundingDirection.Up:
            t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes, 0)); break;
        case RoundingDirection.Down:
            t = (dt.Subtract(DateTime.MinValue)); break;
        default:
            t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes / 2, 0)); break;
    }
    return DateTime.MinValue.Add(new TimeSpan(0,
           (((int)t.TotalMinutes) / minutes) * minutes, 0));
}

誰かがそのメソッドを編集して、私のために機能することを願っています。ありがとう

4

5 に答える 5

40

これにより、指定された間隔に従って丸めることができます。

public static class DateTimeExtensions
{
  public static DateTime Floor(this DateTime dateTime, TimeSpan interval)
  {
    return dateTime.AddTicks(-(dateTime.Ticks % interval.Ticks));
  }

  public static DateTime Ceiling(this DateTime dateTime, TimeSpan interval)
  {
    var overflow = dateTime.Ticks % interval.Ticks;

    return overflow == 0 ? dateTime : dateTime.AddTicks(interval.Ticks - overflow);
  }

  public static DateTime Round(this DateTime dateTime, TimeSpan interval)
  {
    var halfIntervalTicks = (interval.Ticks + 1) >> 1;

    return dateTime.AddTicks(halfIntervalTicks - ((dateTime.Ticks + halfIntervalTicks) % interval.Ticks));
  }
}

秒の切り捨てを処理するには、丸め関数に送信する前に、日時から秒とミリ秒を単純に減算します。

于 2013-09-13T22:48:17.263 に答える
14

どうですか:

case RoundingDirection.Up:
    t = dt.AddMinutes((60 - dt.Minute) % 10);
case RoundingDirection.Down:
    t = dt.AddMinutes(-dt.Minute % 10);

デモ: http://ideone.com/AlB7Q

于 2012-07-06T14:56:44.330 に答える
2

切り捨てる(切り捨てる)簡単な方法は次のとおりです。

var now = DateTime.Now;
var nowTicks = now.Ticks;

//removing the nanoseconds, miliseconds, and seconds from the nowTicks
var lastMinute = new DateTime(nowTicks - (nowTicks % (1000*1000*10*60)));
于 2015-08-13T19:20:40.550 に答える