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 :

Comportement étonnant du Calendar.getTime()


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut Comportement étonnant du Calendar.getTime()
    J'ai une fonction qui reçoit en entrée une string (un type de période: mois, semaine ou personnalisée) et une date, et qui, dans le cas hebdo ou mensuel, retourne le lundi le plus proche de la date d'entrée.

    La fonction donne le résultat attendu, mais à une seule condition : que chaque manipulation du calendrier (add ou set) soit suivie par un appel à Calendar.getTime(). Sans ces appels, le résultat est invariablement le même : la date d'entrée.

    Voici le code correspondant :

    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
     
    public static String getDateAvantPeriode(String type_periode, String dateDebut)  {
    		Date date_base = null;
    		String retour=null;
    		Calendar c = Calendar.getInstance();
    		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");		
    		try {
    			date_base = Outils.convertStringToDate(dateDebut,Outils.DATE_FORMAT);
     
    			//retour au lundi de la semaine
    			if(type_periode.equals("hebdo")) {
     
    				c.setTime(date_base);//RAZ
    				c.set(Calendar.DAY_OF_WEEK, 2); 
    				Date date_hebdo = c.getTime();
    				retour=Outils.convertDateToString(date_hebdo, Outils.DATE_FORMAT);
    			}
    			//retour au 1er lundi du mois
    			else if(type_periode.equals("mois")) {
     
    				c.setTime(date_base);//RAZ
    				int month_original=c.get(Calendar.MONTH);
    				c.set(Calendar.DAY_OF_MONTH, 1);
    				c.getTime();
     
    				c.set(Calendar.DAY_OF_WEEK, 2);
    				c.getTime();
     
    				int month_after=c.get(Calendar.MONTH);
     
    				if(month_original!=month_after) {
    					c.add(Calendar.WEEK_OF_YEAR, 1);
    					c.getTime();
    				}
     
    				Date date_mois = c.getTime();
     
    				retour=Outils.convertDateToString(date_mois, Outils.DATE_FORMAT);
    			}
    			else /*if(type_periode.equals("autre"))*/ {
    				date_base = sdf.parse(dateDebut);
     
    				retour=Outils.convertDateToString(date_base, Outils.DATE_FORMAT);
    			}
    		}
    		catch (ParseException pe) {
    			pe.printStackTrace();
    		}
     
    		return retour;
    	}
    Si vous y comprenez qqch, je veux bien l'explication...

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut
    Bon, j'ai trouvé l'explication.

    En premier lieu, je regardais la mauvaise javadoc (4.2 au lieu de 5.0).

    En débuggant, j'ai remarqué qu'un champ (areFieldsSet) passait à false qd je faisait un set, et à true qd je faisais un getTime().

    un petit tour sur la (bonne) javadoc m'a appris que lors d'une manipulation (set()), la modif n'est qu'interne au calendrier, et n'est appliquée qu'à la prochaine exécution de get(), getTime(), getTimeInMillis(), add() ou roll(), qui recompile le calendrier.

    Autrement dit, il est nécessaire d'avoir une des méthodes ci dessus après chaque set pour prendre en compte les modifications.

    En espérant que ça serve à qq'un un de ces jours.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne vois pas pourquoi tu obtiens précisément la date d'entrée si tu ne le fais pas, mais c'est exact : entre deux appels de Calendar.set() il peut être nécessaire de faire un appel à Calendar.getTime().

    Cela est dû au fait que set() ne force pas le recalcul de la date représentée avant le prochain appel à getTime() ou à add(). Cela évite de faire des calculs inutiles si on place plusieurs champs comme les secondes, les minutes, l'heure, le jour le mois l'année.
    Cela évite également de tenir compte des dépassements (genre 31 Avril) avant que le programme ait une chance d'annuler ce dépassement (genre on mets le mois à Avril ce qui fait le 31 Avril mais on règle le jour du mois à 15 finalement, ce qui fait le 15 Avril.) Pratique mais en contrepartie, ça signifie que les champs ne sont pas recalculés entre deux appels à set(). Donc changer le jour du mois puis changer le jour de la semaine, ça doit faire des trucs surprenants.

    Edit: grillé
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 102
    Par défaut desactivation des JtextField
    bonjour a tous,dans mon application j'ai 4 boutons, Nouveau,Supprimer,Modifier et Sauvegarder,j'ai ecris une methode qui me permet de verrouiller et desactiver les boutons et les zones de texte que j'appelle après,mais je n'arrive pas à desactiver mes zones de texte, les Jtexfields,en fait l'esprit est que,après exécution tant que l'utilisateur ne clique pas sur le bouton nouveau l'acces au differents champs lui est inaccessible.voici ma méthode restaurer().

    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
    public void restaurer() {// pour verrouiller les JtextField à l'execution
    nom.setEnabled(false);
    prenom.setEnabled(false);
    residence.setEnabled(false);
    profession.setEnabled(false);
    adresse.setEnabled(false);
    tel1.setEnabled(false);
    tel2.setEnabled(false);
    solde.setEnabled(false);
    typcpte.setEnabled(false);
    typpiece.setEnabled(false);
    numerocpte.setEnabled(false);
    modpmt.setEnabled(false);
    numpiece.setEnabled(false);
    datetab.setEnabled(false);
    lieuetab.setEnabled(false);
    datouv.setEnabled(false);
    }
    Aussi comment arriver à afficher la date courante dans mon champ de texte datouv.
    comment arriver également lors de l'exécution que mon formulaire de connexion soit soit ma première page,je veux que l'utilisateur se connecte par un login et un mot de passe pour pouvoir avoir accès au autres resssources.pour cela j'utilise une bd

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

Discussions similaires

  1. [CodeTyphon] Delphi -> CodeTyphon : comportement étonnant
    Par parhelie dans le forum Autres IDE
    Réponses: 6
    Dernier message: 27/02/2014, 14h17
  2. Comportement étonnant de split
    Par epehj dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/07/2013, 12h59
  3. [Objective-C] comportement étonnant du focus
    Par Paul TOTH dans le forum Objective-C
    Réponses: 1
    Dernier message: 20/08/2012, 14h47
  4. comportement étonnant de safari et de chrome
    Par julien1451 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2010, 20h49
  5. Comportement étonnant mais heureux pour moi
    Par pelloq1 dans le forum Requêtes
    Réponses: 3
    Dernier message: 05/05/2009, 10h34

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