2012-07-06 26 views
13

Tôi đã tìm kiếm một cơ chế làm tròn thích hợp nhưng không có gì tôi tìm thấy có vẻ là chính xác những gì tôi cần.DateTime Round Up and Down

Tôi cần phải làm tròn và làm tròn một cách riêng biệt và tôi cũng cần tính đến trường hợp đã được làm tròn.

tôi cần làm tròn sau để xảy ra

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 

Về cơ bản tôi cần nó để ROUNDUP() hoặc ROUNDDOWN() để 10 phút gần một cách rõ ràng nhưng nó cũng nên để thời gian bị ảnh hưởng nếu nó đã là một bội số trong 10 phút. Ngoài ra tôi muốn cắt bất kỳ giây để rằng họ không có hiệu lực thi hành thủ tục làm tròn

4:50:45 -> 04:50:00 -> ROUNDUP() -> 4:50

Liệu bất cứ ai có bất kỳ mã tiện dụng nào để thực hiện việc này.

Tôi tìm thấy mã này ở đâu đó nhưng nó tròn 5:00 -> RoundUp() -> 5:10 thay vì để nguyên vẹn vì nó đã là bội số của 10 và không cần làm tròn. Ngoài ra, tôi không chắc chắn về số giây sẽ ảnh hưởng đến nó

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

Hy vọng ai đó có thể chỉnh sửa phương pháp đó để làm cho nó hoạt động cho tôi. Cảm ơn

+3

OK. Vì vậy, bạn có làm tròn mã ở đó. Tại sao bạn không sửa đổi nó để làm cho nó làm những gì bạn cần làm? –

+3

Điều này có hiệu quả không? http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes – comecme

+0

Quy tắc làm tròn của bạn không rõ ràng. Bạn vòng 5:09 đến 5:00 nhưng 4:56 đến 5:00. – Rawling

Trả lời

11

Làm thế nào về:

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

Demo: http://ideone.com/AlB7Q

+1

Điều đó có quan tâm đến giây không? – comecme

+0

@comecme: Newp. – mellamokb

27

này sẽ cho phép bạn tròn theo bất kỳ khoảng thời gian nhất định.

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

Để chăm sóc cắt ngắn giây, tôi chỉ cần trừ giây và mili giây từ ngày giờ trước khi gửi chúng vào các chức năng làm tròn.

0

Đây là một cách nhanh chóng để cắt ngắn (làm tròn xuống)

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

Chức năng này sẽ làm tròn lên hoặc xuống để khoảng gần nhất (phút).

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