149 votes

Comment puis-je calculer la différence de mois entre deux dates ?

En C#/.NET TimeSpan a TotalDays, TotalMinutes, etc. mais je ne peux pas trouver une formule pour le nombre total de mois de différence. Variable de jours par mois et les années bissextiles garder en me jetant à off. Comment puis-je obtenir TotalMonths?

Edit Désolé de ne pas être plus clair: je sais que je ne peux pas vraiment obtenir ce à partir de TimeSpan mais j'ai pensé à l'aide de TotalDays et TotalMinutes serait un bon exemple pour exprimer ce que je cherchais ... sauf que je vais essayer d'obtenir le Total des Mois.

Exemple: Dec 25, 2009 - Oct 6, 2009 = 2 TotalMonths. 6 octobre au 5 Novembre est égal à 0 mois. Nov 6, 1 mois. Sur Dec 6, 2 mois

257voto

Adam Robinson Points 88472

Vous ne serez pas en mesure d'obtenir un TimeSpan, en raison d'un "mois" est une variable de l'unité de mesure. Vous devrez calculer vous-même, et vous devrez comprendre exactement comment vous voulez qu'il fonctionne.

Par exemple, les dates comme July 5, 2009 et August 4, 2009 le rendement d'un mois ou zéro mois de différence? Si vous dites qu'il devrait donner l'un, alors qu' July 31, 2009 et August 1, 2009? Est que un mois? Est-ce simplement la différence de l' Month valeurs pour les dates, ou est-il plus lié à une réelle laps de temps? La logique de la détermination de l'ensemble de ces règles est non-trivial, de sorte que vous aurez à déterminer votre propre et de mettre en œuvre l'algorithme approprié.

Si tout ce que vous voulez, c'est tout simplement une différence dans les mois--ignorant complètement les valeurs de date, vous pouvez utiliser ceci:

public static int MonthDifference(this DateTime lValue, DateTime rValue)
{
    return (lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year);
}

Notez que cette fonction retourne une différence relative, ce qui signifie que si rValue est plus grand que lValue, alors la valeur de retour sera négatif. Si vous voulez une différence absolue, vous pouvez utiliser ceci:

public static int MonthDifference(this DateTime lValue, DateTime rValue)
{
    return Math.Abs((lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year));
}

63voto

Jon Skeet Points 692016

(Je sais que c’est une vieille question, mais...)

C’est assez pénible à faire en pure .NET. Je vous recommande ma propre bibliothèque Temps Noda , qui est particulièrement conçu pour des choses comme cela :

(Il existe d’autres options, par exemple si vous voulez seulement un nombre de mois même au cours des années, vous utiliseriez `` )

28voto

Rubens Farias Points 33357

Peut-être que vous ne voulez pas connaître les fractions de mois ; Qu’en est-il de ce code ?

9voto

Henk Holterman Points 153608

Vous devrez définir ce que vous entendez par TotalMonths d’abord.
Une définition simple met un mois à 30,4 jours (365,25 / 12).

En outre, toute définition, y compris les fractions semble inutile et valeur entière plus commune (mois entiers entre dates) dépend aussi de règles métier non standard.

8voto

JDunkerley Points 7237

Vous avez besoin pour s’en sortir vous-même hors les dates/heures. Comment réglez-vous les jours de l’ébauche à la fin dépendra de ce que vous voulez l’utiliser.

Une méthode serait de compter les mois et ensuite corriger pour les jours à la fin. Quelque chose comme :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X