Вы пробовали что-то вроде следующего? Я успешно использовал аналогичный метод для округления до следующего часа, минуты, дня и т. Д. *
private static readonly long _ticksIn30Mins = TimeSpan.FromMinutes(30).Ticks;
protected DateTime GetRoundedTime(DateTime inputTime)
{
long currentTicks = inputTime.Ticks;
return new DateTime(currentTicks.RoundUp(_ticksIn30Mins));
}
public static class ExtensionMethods
{
public static long RoundUp(this long i, long toTicks)
{
return (long)(Math.Round(i / (double)toTicks,
MidpointRounding.AwayFromZero)) * toTicks;
}
}
Для этого используется метод RoundOff из предыдущего вопроса . Вам просто нужно изменить его, чтобы он всегда округлялся с помощью MidpointRoundingMode.AwayFromZero.
Наконец, чтобы справиться с конкретным случаем с 12:00 до 12:30, проверьте, совпадают ли значения до и после округления, и если да, увеличьте количество тиков (например, 30 минут)
var currentTime = DateTime.Now;
var rounded = GetRoundedTime(currentTime);
if (rounded == currentTime)
{
rounded = new DateTime(rounded.Ticks + _ticksIn30Mins);
}
Для протестированного консольного приложения, демонстрирующего этот принцип, см. Ниже:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
private static readonly long _ticksIn30Mins = TimeSpan.FromMinutes(30).Ticks;
static void Main(string[] args)
{
WriteDateString(new DateTime(2012, 01, 18, 09, 45, 11, 152));
WriteDateString(new DateTime(2012, 01, 18, 12, 15, 11, 999));
WriteDateString(new DateTime(2012, 01, 18, 12, 00, 00, 000));
Console.ReadLine();
}
private static void WriteDateString(DateTime dateTime)
{
Console.WriteLine("Before: {0}, After: {1}", dateTime, GetRoundedTime(dateTime));
}
private static DateTime GetRoundedTime(DateTime inputTime)
{
long currentTicks = inputTime.Ticks;
var rounded = new DateTime(currentTicks.RoundUp(_ticksIn30Mins));
if (rounded == inputTime)
{
rounded = new DateTime(rounded.Ticks + _ticksIn30Mins);
}
return rounded;
}
}
public static class ExtensionMethods
{
public static long RoundUp(this long i, long toTicks)
{
return (long)(Math.Round(i / (double)toTicks, MidpointRounding.AwayFromZero)) * toTicks;
}
}
}
Выход:
С уважением,