65.9K
CodeProject is changing. Read more.
Home

Rounding a DateTime Object to a Defined Number of Minutes

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (6 votes)

Mar 23, 2008

CPOL
viewsIcon

52309

A simple two line function to round a DateTime up, down, or to a nearest defined number of minutes

Introduction

Rounding a DateTime up (or down) to the nearest number of minutes seems a simple requirement, but is surprisingly unintuitive due to the relationships and different properties of DateTime and TimeSpan classes.

I've come across some pretty dreadful examples on the web, so thought I'd post a much simpler (and faster) one.

Using the Code

This function accepts the number of minutes to be rounded to.

public enum eRoundingDirection { up, down, nearest }

public DateTime RoundDateTime(DateTime dt, int minutes, eRoundingDirection direction)

{
  TimeSpan t;

  switch (direction)
  {
    case eRoundingDirection.up:
      t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes, 0)); break;
    case eRoundingDirection.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));
}

Points of Interest

Why use "default:" instead of "nearest"? Simply because it saves defining a default value for the TimeSpan.

Integer math helps keep this function speedy, and avoids those tricky rounding errors in the milliseconds.