次のようなことを試しましたか?同様の方法を使用して、次の1時間、1分、1日などに切り上げることに成功しました...
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:00amが12:30 amになるという特定のケースに対処するために、丸め前と丸め後の値が同じであるかどうかを確認し、同じである場合は、ティックの切り上げ量を増やします(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;
}
}
}
出力:

よろしくお願いします、