Y at - il une fonction simple pour arrondir UP une DateTime
aux 15 minutes les plus proches?
Par exemple
2011-08-11 16:59
devient 2011-08-11 17:00
2011-08-11 17:00
reste comme 2011-08-11 17:00
2011-08-11 17:01
devient 2011-08-11 17:15
DateTime RoundUp(DateTime dt, TimeSpan d)
{
return new DateTime((dt.Ticks + d.Ticks - 1) / d.Ticks * d.Ticks, dt.Kind);
}
Exemple:
var dt1 = RoundUp(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(15));
// dt1 == {11/08/2011 17:00:00}
var dt2 = RoundUp(DateTime.Parse("2011-08-11 17:00"), TimeSpan.FromMinutes(15));
// dt2 == {11/08/2011 17:00:00}
var dt3 = RoundUp(DateTime.Parse("2011-08-11 17:01"), TimeSpan.FromMinutes(15));
// dt3 == {11/08/2011 17:15:00}
DateTime RoundUp(DateTime dt, TimeSpan d) { return new DateTime(((dt.Ticks + d.Ticks - 1) / d.Ticks) * d.Ticks, dt.Kind); }
J'ai trouvé une solution qui n'implique pas de multiplier et de diviser les
long
nombres.Usage:
la source
%d.Ticks
enRoundUp
nécessaire?d.Ticks - (dt.Ticks % d.Ticks))
sera nécessairement inférieur àd.Ticks
, donc la réponse devrait être la même correcte?si vous avez besoin d'arrondir à un intervalle de temps le plus proche (pas supérieur), je suggère d'utiliser ce qui suit
la source
Résultats:
la source
2011-08-11 17:00:01
obtient tronqué à2011-08-11 17:00:00
Puisque je déteste réinventer la roue, je suivrais probablement cet algorithme pour arrondir une valeur DateTime à un incrément de temps spécifié (Timespan):
DateTime
valeur à arrondir en une valeur décimale à virgule flottante représentant le nombre entier et fractionnaire d'TimeSpan
unités.Math.Round()
.TimeSpan
unité.DateTime
valeur à partir du nombre arrondi de graduations et renvoyez-la à l'appelant.Voici le code:
la source
DateTime
, mais je veux aussi la capacité à arrondir jusqu'à un multiple deunit
. PasserMidpointRounding.AwayFromZero
àRound
n'a pas l'effet escompté. Avez-vous autre chose en tête en acceptant unMidpointRounding
argument?Ma version
En tant que méthode, il se verrouillerait comme ça
et s'appelle comme ça
la source
Élégant?
la source
Attention: la formule ci-dessus est incorrecte, c'est à dire la suivante:
devrait être réécrit comme:
la source
/ d.Ticks
arrondit à l'intervalle de 15 minutes le plus proche (appelons ces "blocs"), l'ajout d'un demi-bloc ne garantit pas l'arrondi vers le haut. Considérez quand vous avez 4,25 blocs. Si vous ajoutez 0,5 bloc, puis testez le nombre de blocs entiers que vous avez, vous n'en avez toujours que 4. Ajouter une coche de moins qu'un bloc complet est l'action correcte. Cela garantit que vous passez toujours à la plage de blocs suivante (avant d'arrondir vers le bas), mais vous empêche de vous déplacer entre les blocs exacts. (IE, si vous avez ajouté un bloc complet à 4,0 blocs, 5,0 arrondirait à 5, quand vous voulez 4. 4,99 sera 4.)Une solution plus verbeuse, qui utilise modulo et évite les calculs inutiles.
la source
Il s'agit d'une solution simple pour arrondir à la minute la plus proche. Il préserve les informations TimeZone et Kind de DateTime. Il peut être modifié en fonction de vos propres besoins (si vous devez arrondir aux 5 minutes les plus proches, etc.).
la source
Vous pouvez utiliser cette méthode, elle utilise la date spécifiée pour garantir qu'elle conserve l'un des types de globalisation et de datetime précédemment spécifiés dans l'objet datetime.
Test de violon .Net
Si vous souhaitez utiliser TimeSpan pour arrondir, vous pouvez l'utiliser.
TimeSpan Fiddle
la source
var d = new DateTime(2019, 04, 15, 9, 40, 0, 0);
// devrait être 9:42 mais aucune de ces méthodes ne fonctionne comme ça?