2012-07-06 109 views
13

我一直在尋找適當的舍入機制,但沒有發現我似乎正是我所需要的。DateTime向上和向下舍入

我需要四捨五入和圓整下來,我也需要考慮到它已經四捨五入的情況。

我需要以下四捨五入發生

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 

基本上我需要它綜合報告()或ROUNDDOWN()到最近的10分鐘明確,但它也應該留出時間不變,如果它已經在一個多10分鐘。此外,我想任何秒截斷到它們對圓程序

4時五十零分45秒沒有效果 - >四點五十分00秒 - >綜合報告() - > 4:50

不任何人都有任何方便的代碼來實現這一點。

我發現這個代碼在某處,但它輪到5:00 - > RoundUp() - > 5:10,而不是保持原樣,因爲它已經是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)); 
} 

希望有人可以編輯該方法,使它爲我工作。由於

+3

好的。所以你有四捨五入的代碼。你爲什麼不修改它來做它你需要做的事情? – 2012-07-06 14:49:01

+3

這項工作? http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes – comecme 2012-07-06 14:53:40

+0

你的舍入規則不清楚。你週五5:09到5:00但是4點56分到5點。 – Rawling 2012-07-06 14:58:32

回答

11

如何:

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

演示:http://ideone.com/AlB7Q

+1

這是否照顧秒? – comecme 2012-07-06 15:06:26

+0

@comecme:Newp。 – mellamokb 2012-07-06 15:17:00

27

這將讓你圓根據給定的任何間隔。

private static DateTime Floor(DateTime dateTime, TimeSpan interval) 
{ 
    return dateTime.AddTicks(-(dateTime.Ticks % interval.Ticks)); 
} 

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

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

private static DateTime Round(DateTime dateTime, TimeSpan interval) 
{ 
    var halfIntervelTicks = ((interval.Ticks + 1) >> 1); 

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

採取截斷秒的關懷,送他們入舍入函數之前,我想簡單地減去日期時間的秒和毫秒。

0

這裏是截斷(向下取整)

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

該函數將圓向上或向下到最接近的間隔(分鐘)的快速方法。

private static DateTime NormalizeReadingInterval(DateTime originalTime, int interval) 
    { 
     if (originalTime.Minute % interval == 0) return originalTime; 
     var epochTime = new DateTime(1900, 1, 1); 
     var minutes = (originalTime - epochTime).TotalMinutes; 
     var numIntervals = minutes/interval; 
     var roundedNumIntervals = Math.Round(numIntervals, 0); 
     return epochTime.AddMinutes(roundedNumIntervals * interval); 
    }