using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MP.MONO.Core
{
public class TimeUtils
{
///
/// Effettua trim di una data al numero di minuti indicato
///
/// vedere qui:
/// https://stackoverflow.com/questions/1393696/rounding-datetime-objects
///
/// DataOra originale
/// Minuti di arrotondamento richeisti
/// Arrotondamento x difetto (floor = true) o eccesso (false)
///
public static DateTime DateRounded(DateTime DateOrig, int roundMin, bool isFloor)
{
long ticks = 0;
roundMin = roundMin <= 0 ? 1 : roundMin;
TimeOnly step = new TimeOnly(0, roundMin);
if (isFloor)
{
ticks = DateOrig.Ticks / step.Ticks;
}
else
{
ticks = (DateOrig.Ticks + step.Ticks - 1) / step.Ticks;
}
DateTime answ = new DateTime(ticks * step.Ticks, DateOrig.Kind);
return answ;
}
///
/// Effettua arrotondamento di un timespan ad un dato step di minuti
///
/// vedere qui:
/// https://stackoverflow.com/questions/1393696/rounding-datetime-objects
///
/// DataOra originale
/// Minuti di arrotondamento richeisti
/// Arrotondamento x difetto (floor = true) o eccesso (false)
///
public static TimeSpan TSpanRounded(TimeSpan TSpanOrig, int roundMin, bool isFloor)
{
long ticks = 0;
roundMin = roundMin <= 0 ? 1 : roundMin;
TimeOnly step = new TimeOnly(0, roundMin);
if (isFloor)
{
ticks = TSpanOrig.Ticks / step.Ticks;
}
else
{
ticks = (TSpanOrig.Ticks + step.Ticks - 1) / step.Ticks;
}
TimeSpan answ = new TimeSpan(ticks * step.Ticks);
return answ;
}
///
/// Effettua arrotondamento di un timespan ad un dato step di minuti
///
/// vedere qui:
/// https://stackoverflow.com/questions/1393696/rounding-datetime-objects
///
/// DataOra originale
/// Minuti di arrotondamento richeisti
///
public static TimeSpan TSpanRounded(TimeSpan TSpanOrig, int roundMin)
{
long ticks = 0;
roundMin = roundMin <= 0 ? 1 : roundMin;
TimeOnly step = new TimeOnly(0, roundMin);
ticks = (TSpanOrig.Ticks + step.Ticks / 2) / step.Ticks;
TimeSpan answ = new TimeSpan(ticks * step.Ticks);
return answ;
}
}
}