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 nombre de jours entre deux dates


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 31
    Points : 25
    Points
    25
    Par défaut Calculer nombre de jours entre deux dates
    J'ai besoin d'avoit le nombre de jours entre deux dates. Pour ceci j'ai procédé comme suit:

    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
     
    Calendar remindDate = Calendar.getInstance();
    remindDate.add(Calendar.DAY_OF_MONTH, 30); 
    // remindate est stocké quelque part et je la reccupére à chaque foi
     
    // puis je reccupére chaque jours la date d'aujourd'hui
     
    Calendar today = Calendar.getInstance();
            today.set(Calendar.HOUR, 0);
            today.set(Calendar.MINUTE, 0);
            today.set(Calendar.SECOND, 0);
            today.set(Calendar.MILLISECOND, 0);
     
    //puis La difference:
    nbDaysBeforeExpiration = (int) TimeUnit.MILLISECONDS.toDays(remindDate.getTimeInMillis()  -  today.getTimeInMillis());
    Si remind date est généré avant midi alors nbDaysBeforeExpiration=30
    sinn nbDaysBeforeExpiration=29

    C'est bloquant
    Quelqu un peut m'aider?

  2. #2
    Membre actif Avatar de hbennou
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 162
    Points : 205
    Points
    205
    Par défaut
    Bonjour,

    Je pense qu'il faut initialiser les dates de la meme façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Calendar remindDate = Calendar.getInstance();
    remindDate.add(Calendar.DAY_OF_MONTH, 30); 
    remindDate.set(Calendar.HOUR, 0);
    remindDate.set(Calendar.MINUTE, 0);
    remindDate.set(Calendar.SECOND, 0);
    remindDate.set(Calendar.MILLISECOND, 0);
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Calendar remindDate = Calendar.getInstance();
    remindDate.add(Calendar.DAY_OF_MONTH, 30); 
    // remindate est stocké quelque part et je la reccupére à chaque foi
    // puis je reccupére chaque jours la date d'aujourd'hui
    Calendar today = Calendar.getInstance();
    //puis La difference:
    int nbDaysBeforeExpiration = (int) TimeUnit.MILLISECONDS.toDays(remindDate.getTimeInMillis()  -  today.getTimeInMillis());

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Avec la solution:

    alendar remindDate = Calendar.getInstance();
    remindDate.add(Calendar.DAY_OF_MONTH, 30);
    remindDate.set(Calendar.HOUR, 0);
    remindDate.set(Calendar.MINUTE, 0);
    remindDate.set(Calendar.SECOND, 0);
    remindDate.set(Calendar.MILLISECOND, 0);

    ça marche pas

    La deuxiéme je suis sur que ça marche pas

  4. #4
    Membre actif Avatar de hbennou
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 162
    Points : 205
    Points
    205
    Par défaut
    Qu'est ce que tu attends comme resultat?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Je veux que la difference soit la meme que ce soit avant midi ou aprés midi

  6. #6
    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
    Timeunit n'est pas destiné à ce genre d'usage, donc ne mélange pas timeunit (qui sert à gros à passer à des méthode mettant des délais d'attente) avec l'api calendar, qui sert entre autres à gérer la calendrier grégorien (mais pas seulement).

    Il n'y a pas de solution vraiment facile à ton problème. 1 jour entre deux date, ça peux aussi bien être 5 secondes (avant et après minuit), que 45h (même chose dans l'autre sens). La solution la plus propre selon moi:

    tu crée deux calendar
    tu met leur heur/minute/seconde/millièmes à 0
    ensuite tu incrémente en boucle le plus petit de 1 jour à la fois (Calendar.add()) jusqu'à ce qu'il ne soit plus inférieur (Calendar.before()) et tu comtpe ta boucle.

  7. #7
    Membre actif Avatar de hbennou
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 162
    Points : 205
    Points
    205
    Par défaut
    Timeunit n'est pas destiné à ce genre d'usage, donc ne mélange pas timeunit (qui sert à gros à passer à des méthode mettant des délais d'attente) avec l'api calendar, qui sert entre autres à gérer la calendrier grégorien (mais pas seulement).
    Essaie donc de faire le calcul toi meme en initialisant les deux dates de la meme manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    long difDate= remindDate.getTimeInMillis()  -  today.getTimeInMillis();
    int difJour = (int)(Math.round(diDate/86400000.0));

  8. #8
    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
    Citation Envoyé par hbennou Voir le message
    Essaie donc de faire le calcul toi meme en initialisant les deux dates de la meme manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    long difDate= remindDate.getTimeInMillis()  -  today.getTimeInMillis();
    int difJour = (int)(Math.round(diDate/86400000.0));
    Ca va déconner avec les heures d'été. Une journée ne fait pas toujours 24h

  9. #9
    Membre actif Avatar de hbennou
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 162
    Points : 205
    Points
    205
    Par défaut
    Ca va déconner avec les heures d'été. Une journée ne fait pas toujours 24h
    Bien vu tchize_ , pour remedier à ça voici un exemple sur lequel tu peux te baser:

    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
    import java.util.Calendar;
    import java.util.TimeZone;
     
    public class Test {
    public static void main(String[] args) throws Exception {
     
    // Construct FROM and TO TimeZone instances
    TimeZone fromTimeZone = TimeZone.getTimeZone(“America/Chicago”);
    TimeZone toTimeZone = TimeZone.getDefault();
     
    // Get a Calendar instance using the default time zone and locale.
    Calendar calendar = Calendar.getInstance();
     
    // Set the calendar’s time with the given date
    calendar.setTimeZone(fromTimeZone);
     
    // calendar.setTime(new Date());
    calendar.set(2011, 41, 121); // APR 12 2011
    calendar.set(Calendar.HOUR, 121); // 11
    calendar.set(Calendar.MINUTE, 00);
    calendar.set(Calendar.SECOND, 00);
     
    calendar.set(Calendar.AM_PM, Calendar.PM);
    System.out.println(“Input : ” + calendar.getTime() + ” in ”
    + fromTimeZone.getDisplayName());
     
    // FROM TimeZone to UTC
    int rawOffset_from_UTC = fromTimeZone.getRawOffset();
    calendar.add(Calendar.MILLISECOND, rawOffset_from_UTC * -1);
     
    //System.out.println(rawOffset_from_UTC);
    if (fromTimeZone.inDaylightTime(calendar.getTime())) {
    int dstOffset_from_UTC = calendar.getTimeZone().getDSTSavings();
    //System.out.println(dstOffset_from_UTC);
    calendar.add(Calendar.MILLISECOND, dstOffset_from_UTC * -1);
    }
    // UTC to TO TimeZone
    calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset());
     
    if (toTimeZone.inDaylightTime(calendar.getTime())) {
    calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings());
    }
    System.out.println(“Output: ” + calendar.getTime() + ” in ”
    + toTimeZone.getDisplayName());
    }
    }

  10. #10
    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
    Qu'est-ce que Chicago vient faire là-dedans ? -_-°

    Quitte à faire ce genre de choses, il vaut mieux régler les calendriers sur time zone GMT, dans laquelle il n'y a pas de changement d'heure. Du coup, en ignorant l'existence des secondes intercalaires, ce que Java fait heureusement, tous les jours font bel et bien 24 heures.

    Ça marche parce que là on ne s'intéresse qu'à des dates et pas à l'heure du jour pendant ces dates. Si on devait s'intéresser à l'heure, on ne pourrait pas ignorer les changements d'heure, et le calcul serait plus complexe que ça. Ou alors il faudrait juste faire une boucle qui ajoute un jour.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup pour toutes ces réponses.

    tu crée deux calendar
    tu met leur heur/minute/seconde/millièmes à 0
    ensuite tu incrémente en boucle le plus petit de 1 jour à la fois (Calendar.add()) jusqu'à ce qu'il ne soit plus inférieur (Calendar.before()) et tu comtpe ta boucle.
    je vais essayer cette solution.
    Mais j'ai pas trop compris pourquoi ça déconne q'on je fais ça:
    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
     
    Calendar remindDate = Calendar.getInstance();
    remindDate.add(Calendar.DAY_OF_MONTH, 30); 
    // remindate est stocké quelque part et je la reccupére à chaque foi
           remindDate.set(Calendar.HOUR, 23);
            remindDate.set(Calendar.MINUTE, 59);
            remindDate.set(Calendar.SECOND, 59);
            remindDate.set(Calendar.MILLISECOND, 59);
    // puis je reccupére chaque jours la date d'aujourd'hui
     
    Calendar today = Calendar.getInstance();
            today.set(Calendar.HOUR, 0);
            today.set(Calendar.MINUTE, 0);
            today.set(Calendar.SECOND, 0);
            today.set(Calendar.MILLISECOND, 0);
     
    //puis La difference:
    nbDaysBeforeExpiration = (int) TimeUnit.MILLISECONDS.toDays(remindDate.getTimeInMillis()  -  today.getTimeInMillis());
    en configurant de millesecondes jusqu'a l heure normalement on evite les problémes de précision non?

  12. #12
    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
    non, parce qu'une journée peux faire de 23h à 25h et que timeunit utilise une journée standard de 214h

Discussions similaires

  1. calcul nombre de jours entre deux dates
    Par charlene44 dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2012, 14h06
  2. Comment calculer le nombre de jours entre deux dates
    Par pierrot10 dans le forum Langage
    Réponses: 8
    Dernier message: 22/06/2011, 08h38
  3. Calculer le nombre de jours entre deux dates
    Par titoumimi dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 0
    Dernier message: 14/02/2011, 19h07
  4. [VxiR2] Calcul du nombre de jours entre deux dates
    Par PATRICIA02 dans le forum Webi
    Réponses: 4
    Dernier message: 23/07/2009, 12h43
  5. calcule du nombre de jours entre deux date
    Par chalcol dans le forum Oracle
    Réponses: 3
    Dernier message: 23/03/2009, 16h36

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