using System;
public class Test
{
public static void Main()
{
{
Extensions.EnableKindFix = false;
var now = DateTime.Now.RoundToNearest(TimeSpan.FromMinutes(1));
Console.WriteLine(now + " --- " + now.Kind);
var nowFT = now.ToFileTimeUtc();
var nowDT = DateTime.FromFileTime(nowFT);
Console.WriteLine(nowDT);
}
{
Extensions.EnableKindFix = true;
var now = DateTime.Now.RoundToNearest(TimeSpan.FromMinutes(1));
Console.WriteLine(now + " --- " + now.Kind);
var nowFT = now.ToFileTimeUtc();
var nowDT = DateTime.FromFileTime(nowFT);
Console.WriteLine(nowDT);
}
}
}
static class Extensions
{
public static bool EnableKindFix { get; set; }
public static DateTime RoundUp(this DateTime dt, TimeSpan d)
{
var delta = (d.Ticks - (dt.Ticks % d.Ticks)) % d.Ticks;
return EnableKindFix
? new DateTime(dt.Ticks + delta, dt.Kind)
: new DateTime(dt.Ticks + delta);
}
public static DateTime RoundDown(this DateTime dt, TimeSpan d)
{
var delta = dt.Ticks % d.Ticks;
return EnableKindFix
? new DateTime(dt.Ticks - delta, dt.Kind)
: 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);
}
}