IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Calculer le nombre de jours dans le mois à partir d'un date range


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué Avatar de arnaud036
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 201
    Points : 172
    Points
    172
    Par défaut Calculer le nombre de jours dans le mois à partir d'un date range
    Salut,

    N'etant pas bon dans la manipulation de date, je cherche a savoir comment implementer une methode qui retourne le nombre de jour qu'il dans un mois a partir d'un date range.

    Example 1:
    Date range: 20/01/2012 - 10/03/2012
    Janvier 2012: 11 jours
    Fevrier 2012: 29 jours
    Mars 2012: 10 jours

    Example 2:
    Date range: 20/01/2012 - 25/01/2012
    Janvier 2012: 5 jours

    Signature de la methode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int getDaysFromThisMonth(Date startDate, Date endDate, int month, int year)
    Je me demander aussi si il serai possible de remplacer (int month, int year) par un autre objet ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par arnaud036 Voir le message
    Example 1:
    Date range: 20/01/2012 - 10/03/2012
    Janvier 2012: 11 jours
    Fevrier 2012: 29 jours
    Mars 2012: 10 jours

    Example 2:
    Date range: 20/01/2012 - 25/01/2012
    Janvier 2012: 5 jours
    C'est un peu bizarre, non ?

    du 20 au 25 :
    - 20 Janvier
    - 21 Janvier
    - 22 Janvier
    - 23 Janvier
    - 24 Janvier
    - 25 Janvier.

    Ça fait 6 jours, pas 5. C'est lequel qu'on ne compte pas ?
    Pareil dans l'exemple du 20 Janvier au 10 Mars : si on compte le 20 Janvier ça fait 12 jours en Janvier, pas 11.


    [quote=arnaud036;6650188]Signature de la methode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int getDaysFromThisMonth(Date startDate, Date endDate, int month, int year)
    Pour commencer, je construirais deux objets Date : Date monthStart et Date monthEnd, représentant le premier jour et le dernier jour du mois voulu.

    Je vérifierais si monthEnd est bien égal ou supérieur à startDate, et si monthStart est bien égal ou inférieur à endDate. Si non, il y a zéro jour. Si oui, on va pouvoir travailler.

    - Prendre le plus tardif entre startDate et monthStart. Construire un Calendar à cette date-là. Compter 1 jour. Prendre le plus tôt entre endDate et monthEnd.
    - Ajouter un jour au Calendar. Faire getTime() dessus et vérifier s'il est égal ou inférieur à la date de fin. Si oui, compter un jour et recommencer. Si non, s'arrêter et renvoyer le décompte des jours.

    Citation Envoyé par arnaud036 Voir le message
    Je me demander aussi si il serai possible de remplacer (int month, int year) par un autre objet ?
    Par exemple, un objet Date ou Calendar réglé au premier jour du mois. Mais bon, la différence est pas énorme.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il ya a before et after sur Calendat pour s'économiser le travail :p
    Sinon, effectivement, une boucle qui ajoute un jour au Calendar jusqu'à dépasser la date de fin.

  4. #4
    Membre habitué Avatar de arnaud036
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 201
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est un peu bizarre, non ?

    du 20 au 25 :
    - 20 Janvier
    - 21 Janvier
    - 22 Janvier
    - 23 Janvier
    - 24 Janvier
    - 25 Janvier.

    Ça fait 6 jours, pas 5. C'est lequel qu'on ne compte pas ?
    Pareil dans l'exemple du 20 Janvier au 10 Mars : si on compte le 20 Janvier ça fait 12 jours en Janvier, pas 11.
    Oui effectivement tu as raison ! Merci pour ton aide, je vais essayer de coder cette methode.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Avec Joda Time, c'est réalisé assez rapidement. Et le code, bien que verbeux, est lisible. Au lieu d'itérer sur chaque jour et de l'ajouter si nécessaire, on va itérer sur chaque mois. C'est, je crois, une économie intéressante de calcul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import java.util.Locale;
    import java.util.Map;
    import java.util.TreeMap;
     
    import org.joda.time.Days;
    import org.joda.time.LocalDate;
    import org.joda.time.YearMonth;
    import org.joda.time.format.DateTimeFormat;
    import org.joda.time.format.DateTimeFormatter;
     
    public class DateDifference {
    	public static void main(String[] args) {
     
    		LocalDate start = new LocalDate(2012, 1, 20);
    		LocalDate end = new LocalDate(2012, 3, 10);
     
    		Map<YearMonth, Integer> daysByMonth = daysByMonthBetween(start, end);
     
    		DateTimeFormatter dateFormatter = DateTimeFormat.forPattern("MMMM yyyy").withLocale(Locale.FRENCH);
     
    		for (Map.Entry<YearMonth, Integer> e : daysByMonth.entrySet()) {
    			System.out.printf("%s : %s jours%n", dateFormatter.print(e.getKey()), e.getValue());
    		}
    	}
     
    	private static Map<YearMonth, Integer> daysByMonthBetween(LocalDate start, LocalDate end) {
     
    		if (start.isAfter(end)) {
    			throw new IllegalArgumentException("start doit être avant end");
    		}
     
    		// Travailler avec des mois est plus facile
    		YearMonth startMonth = new YearMonth(start);
    		YearMonth endMonth = new YearMonth(end);
     
    		Map<YearMonth, Integer> daysByMonth = new TreeMap<YearMonth, Integer>();
     
    		if (startMonth.equals(endMonth)) {
    			// Si les deux dates sont dans le même mois, c'est facile.
     
    			// On rajoute + 1 jour car Joda calcule les temps 'à minuit'. On veut le dernier jour complet.
    			daysByMonth.put(startMonth, Days.daysBetween(start, end).getDays() + 1);
     
    		} else {
    			// Si les deux dates ne sont pas dans le même mois, on calcule d'abord le nombre de jours jusqu'à la fin du mois
    			daysByMonth.put(startMonth, Days.daysBetween(start, start.dayOfMonth().withMaximumValue()).getDays() + 1);
     
    			for (YearMonth m = startMonth.plusMonths(1); !m.equals(endMonth); m = m.plusMonths(1)) {
    				// ensuite, pour chaque mois entre les deux, on ajoute le nombre de jours dans celui-ci.
    				daysByMonth.put(m, Days.daysIn(m.toInterval()).getDays());
    			}
     
    			// Enfin, on ajoute le nombre de jours entre le 1er du mois et la date voulue.
    			// On rajoute + 1 jour car Joda calcule les temps 'à minuit'. On veut le dernier jour complet.
    			daysByMonth.put(endMonth, Days.daysBetween(end.dayOfMonth().withMinimumValue(), end).getDays() + 1);
    		}
     
    		return daysByMonth;
    	}
     
    }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    janvier 2012 : 12 jours
    février 2012 : 29 jours
    mars 2012 : 10 jours

Discussions similaires

  1. Nombre de jours dans le mois
    Par vpourchet dans le forum Débuter
    Réponses: 4
    Dernier message: 19/08/2017, 00h07
  2. Date : Nombre de jour dans le mois
    Par grunk dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 29/07/2008, 16h48
  3. Réponses: 4
    Dernier message: 28/05/2007, 19h38
  4. [Dates] Calculer le nombre de jours dans le mois suivant...
    Par Life Hunter dans le forum Langage
    Réponses: 5
    Dernier message: 14/03/2006, 00h01
  5. [CR]nombre de jours dans un mois donné
    Par liberio dans le forum Formules
    Réponses: 2
    Dernier message: 20/04/2004, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo