Is there a simple function for rounding a DateTime down to the nearest 30 minutes, in C#?

后端 未结 7 1070
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-02 01:35

For example:

2011-08-11 16:59 becomes 2011-08-11 16:30

7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-02 02:26

    A more generic solution rounding to the nearest time span:

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

    It would be used this way:

    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

    More in this response.

提交回复
热议问题