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 :

Problème de date [Débutant(e)]


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Points : 250
    Points
    250
    Par défaut Problème de date
    Bonjour,
    j'ai un problème de date qui parait evident mais je ne vois pas où est l'erreur

    J'ai une date java "crfDataDateF" qui est le 20Oct2011 (ma console m'affiche "Thu Oct 20 00:00:00 CEST 2011")

    Je veux rajouter 21 jour plus 1 milliseconde à cette date pour obtenir la date java "date_m"
    j'ai les parametres suivants
    param_m = 21
    dateUnitCoeff = 86400000 (nombre de milliseconde dans 1 jour)

    et j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    date_m = new Date();
    date_m.setTime(crfDataDateF.getTime() + (param_m * dateUnitCoeff) + 1);
    Si je calcule de tete sur un calendrier cela devrait me donner le 10 novembre 2011 à 00:00:00:001

    mais la console m'indique "date_m = Wed Nov 09 23:00:00:001 CET 2011"
    Il enlève 1 heure. Pourquoi ?

    De même si je veux ajouter 28 jours moins 1 milliseconde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    param_M = 28;
    date_M = new Date();
    date_M.setTime(crfDataDateF.getTime() + (param_M * dateUnitCoeff) - 1);
    Normalement il devrait m'indiquer 16 novembre 2011 à 23:59:59:999

    mais la console m'indique "Wed Nov 16 22:59:59:999 CET 2011"

    il m'enlève encore 1 heure. Je ne vois pas pourquoi


    Merci d'avance pour vos réponse

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 620
    Points : 15 697
    Points
    15 697
    Par défaut
    mais la console m'indique "date_m = Wed Nov 09 23:00:00:001 CET 2011"
    Il enlève 1 heure. Pourquoi ?
    Le passage a l'heure d'hiver qui fait perdre une heure.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Ou pour le dire autrement, certains jours ne contiennent pas autant de millisecondes que les autres (puisqu'ils ont une heure de plus ou de moins).

    Pour ajouter des jours à une date, il vaut mieux passer par un Calendar. Il se chargera des ajustements lui-même.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Points : 250
    Points
    250
    Par défaut
    Merci Uther et Thelvin pour vos réponses,

    j'ai beau retourner le problème dans tous les sens, je ne vois pas comment je peux me caler sur l'heure solaire.

    En fait je veux qu' une autre date soit comprise entre crfDataDateF + 21 jours et crfDataDateF + 28 jours et ceci en me calant sur l'heure solaire.

    Je veux par exemple que si crfDataDateF = 20 oct 2011 00:00:00:000 que cette autre date soit entre (les bornes étant incluses) 10 nov 2011 00:00:00:000 et 17 nov 2011 00:00:00:000

    Ca serait sympa si vous pouviez me donner quelques lignes de code. Par avance Merci

  5. #5
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Bonjour,

    La méthode roll() de la classe Calendar devrait répondre à ton besoin.

    Un exemple qui te permet d'ajouter 28 jours à un objet Calendar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjetCalendar.roll(Calendar.DAY_OF_YEAR, 28);
    Et tu trouveras dans la javadoc les différentes méthodes dont tu pourrais avoir besoin pour la conversation entre Date et Calendar.

    Benoti

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Points : 250
    Points
    250
    Par défaut
    Merci pour ta réponse bboulch, mais j'avais essayé ce dont tu parle mais quand tu ajoute un nombre de jour avec cette manière et que tu lis ensuite la date, il y a toujours une heure de décalage.

    J'ai fais ce qui suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        private void setWinterSummerOffset(Date crfDataDateF, Date date_v) {
            SimpleTimeZone ParisSimpleTimeZone = new SimpleTimeZone(3600000,"Europe/Paris",Calendar.MARCH, -1, Calendar.SUNDAY,3600000, SimpleTimeZone.UTC_TIME,Calendar.OCTOBER, -1, Calendar.SUNDAY,3600000, SimpleTimeZone.UTC_TIME,3600000);
            if (ParisSimpleTimeZone.inDaylightTime(crfDataDateF) && !ParisSimpleTimeZone.inDaylightTime(date_v)) {
                date_v.setTime(date_v.getTime()+ParisSimpleTimeZone.getDSTSavings());
            }
            if (!ParisSimpleTimeZone.inDaylightTime(crfDataDateF) && ParisSimpleTimeZone.inDaylightTime(date_v)) {
                date_v.setTime(date_v.getTime()-ParisSimpleTimeZone.getDSTSavings());
            }
        }

  7. #7
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Autant pour moi, je n'avais pas fait attention à "CES"T qui se transforme en "CET".

    Benoit

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Je vois pas de problème avec Calendar.roll() ou Calendar.add(), moi.

  9. #9
    Membre éclairé

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Points : 791
    Points
    791
    Par défaut
    Thelvin,

    Pour répondre à ta question, selon ce que j'ai pu constater et comprendre, en partant de la date "Thu Oct 20 17:00:00 CEST 2011" après un add() ou un roll(), j'obtiens "Thu Nov 17 17:00:00 CET 2011".

    Ce qui me paraissait pas mal. Mais ce que semblait vouloir Flamant, c'était rester sur l'heure solaire. Ce qui n'est pas le cas là car d'une date CEST/heure d'été nous passons en une date CET/heure d'hiver.

    Benoit

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Ok, merci. Je calculais pas trop le concept d'heure solaire, en fait, mais Google m'a éclairé.

    Et maintenant que je le comprends, je vois pas trop ce qu'il vient faire dans une mesure de temps informatisée -_-°. Je suppose qu'il voulait dire "se caler sur l'heure d'hiver". Autrement dit ne pas appliquer de changement d'heure.

    Dans ces cas-là, je ne passerais pas par un Calendar. Je comparerais juste les millisecondes obtenues par getTime(), et ajouterais 21 jours fois 24 heures fois 60 minutes fois 60 secondes fois 1000 millisecondes. Après tout, le but est précisément de ne pas respecter les ajustements calendaires.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 15h34
  2. problème de date
    Par baboune dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 10/06/2004, 10h52
  3. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 11h21
  4. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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