6
votes

Comptez le nombre de dates inclusives couvertes d'une période de date

Je cherche à compter le nombre de dates couverts (inclus) entre deux DateTimes .

Ce n'est pas .totaldays . Comme des périodes inférieures à 24 heures peuvent toujours renvoyer "2" en se chevauchant deux jours différents. De même, deux dates à quelques minutes d'interruption devraient toujours renvoyer "1".

par exemple: xxx

Je peux obtenir cette fonctionnalité avec le code ci-dessous: xxx

y a-t-il une meilleure façon?


4 commentaires

Qu'en est-il de d1.date.Subrer (d2.date) .Taldays + 1


Je ne sais pas comment c'est un duplicata. Deux dates le même jour devraient toujours revenir 1. Une période de moins de 24 heures de passage à deux jours devrait retourner deux jours.


Nodatime est idéal pour ce genre de chose, reportez-vous à: [Comment utiliser Nodatime pour calculer une période de jours inclus] [1] [1]: Stackoverflow.com/questions/10336863/...


Ce n'est pas un duplicata comme en témoigne le fait qu'il a une réponse différente de la duplication nominée ...


4 Réponses :


19
votes

Pourquoi pas seulement: xxx

à l'aide de .Date normalise la date à minuit (0:00), ajoutez 1 au jours Pour obtenir le nombre de dates différentes, pas seulement le nombre de jours entre les deux entre les deux.

Utilisation de Durée veille à avoir toujours une réponse positive.


4 commentaires

Ça va le faire. Acceptera quand je peux. Je n'ai pas remarqué que c'était toujours éteint par 1 pour tous les tests si bon endroit.


Vous pouvez utiliser un moins plutôt que .Subrent pour le simplifier un peu (selon la réponse de @tim Schmelter)


@MattMitchell Oui, c'est une question de préférence, j'aime utiliser soustraire quand je enchaînement comme ça.


Incidemment, votre Durée () devrait être une méthode appelée pas une propriété. Il gère en fait des dates mal signalées que mon échantillon original ne le fait pas.



0
votes
DateTime d1=DateTime.MinValue;
DateTime d2=DateTime.MaxValue;
TimeSpan span=d2-d1;
int counter = span.Days + 1;

1 commentaires

signifie que vous voulez aussi calculer des mois aussi



7
votes

Peut-être simplement xxx

démo


4 commentaires

Oui cela le fait, +1. Davio vous a battu au poinçon malheureusement pour accepté.


@MattMitchell: Mais j'utiliserais Timespan.days de toute façon au lieu de total des jours car vous ne voulez pas compter les fractions de jours ( double ) mais juste le composant jours ( int ).


@MattMitchell: Je vois que Davio l'a également changé afin que mon argument soit inutile de toute façon;)


Ouais. Si c'était un point de rupture, j'aurais changé la réponse acceptée, mais cela n'a pas d'importance de fonctionnement. Merci pour l'aide.



0
votes

math.ceiling ((d2 - d1.date) .totaldays)

essayé tous les cas que vous avez mentionnés. Et les résultats sont attendus! J'espère que cela aide.


2 commentaires

Bon effort, mais il ne traitera pas de 2000/1/1 23:00 à 2000/1/2 00:00 (il revient 1 et devrait être 2 comme il y a 2 dates là). Voir la réponse acceptée de Davio pour une solution de travail.


@MattMitchell, cela démontre que "prenant plafond " n'est pas la même chose que "prise étage et ajout 1 ". Ce dernier donnerait un comportement correct.