frmoul Posté(e) 31 janvier 2011 Share Posté(e) 31 janvier 2011 Bonsoir, Pour une application, j'ai besoin d'une fonction retournant un numéro de semaine à partir d'une date. Dans mon appli, j'utilise des dates sous forme de string (voir le format de "date_saisie" plus bas) car elle est seulement lue par l'utilisateur. Par contre, pour trier des données (sommer des quantitées rentrées chaque jour), je veux soit afficher les quantités par jour soit par semaine, pour que l'utilisateur ait l'info qu'il recherche. Pour cela, je souhaite cette fonction. Voici le format de date que j'utilise ("date_saisie") : // get the current date : récup dans on create car on n'utilise pas l'appli à cheval sur deux jours) sdf = new SimpleDateFormat("dd-MM-yyyy"); c = Calendar.getInstance(); mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH)+1; mDay = c.get(Calendar.DAY_OF_MONTH); mHour = c.get(Calendar.HOUR_OF_DAY); StringBuilder date_depart = new StringBuilder(20); date_depart.append(mDay).append("-").append(mMonth).append("-").append(mYear); //date_saisie=date_depart.toString(); date_saisie = sdf.format(c.getTime()).toString(); Pour répondre à ce problème, j'ai trouvé la fonction suivante sur le net, je ne m'en sort pas. Avez-vous plus simple ? public void WeekNum(String strDate){ // input Date Format : dd-mm-yyyy Context lecontext=getBaseContext(); Toast.makeText(lecontext,"entree fonction",Toast.LENGTH_SHORT).show(); int weekNo=0,i=0; String strWeekNo=null; int noOfDaysInTheYear=365; int WEEK_STARTS_ON = 2; // Define the day on which week starts Sunday/Monday 1:Sunday 2:Monday int firstDayNoInFirstWeekOfPresentYear=0; // Inititalize the day on which week is starting in present year int firstDayOfPresentYear=0; // Inititlize the 1st day of the present year whether Sunday/Monday/..... int[] monthDaysArray = {31,28,31,30,31,30,31,31,30,31,30,31}; // Define array of the days as per months int todaysDayNoInPresentYear=0; int daysLateByFirstWeekStartedAfterYearStarted=0; int intTemp=0; //Context lecontext=getBaseContext(); Toast.makeText(lecontext,"juste avant strDate",Toast.LENGTH_SHORT).show(); Toast.makeText(lecontext,strDate,Toast.LENGTH_SHORT).show(); //strDate="24/08/2000"; // For test purpose final String[] date_split = strDate.split("-"); int day = Integer.parseInt(date_split[0]); int month= Integer.parseInt(date_split[1]); int year = Integer.parseInt(date_split[2]); Toast.makeText(lecontext, day,Toast.LENGTH_SHORT).show(); Toast.makeText(lecontext, month,Toast.LENGTH_SHORT).show(); Toast.makeText(lecontext, year,Toast.LENGTH_SHORT).show(); GregorianCalendar cal = new GregorianCalendar(); // Check if present year is leap year boolean boolIsLeapYear = cal.isLeapYear(year); // If it is boolean year then add 1 to total days in the year & add one more day to february if(boolIsLeapYear){ noOfDaysInTheYear=noOfDaysInTheYear+1; monthDaysArray[1]=monthDaysArray[1]+1;} // Find the 1st day of this year Calendar calObj = new GregorianCalendar(year, Calendar.JANUARY, 1); firstDayOfPresentYear = calObj.get(Calendar.DAY_OF_WEEK); int intRemoveNoOfDaysFromWeek=0; // # Find the day no of prsent day for(i=0;i<month;i++){ // get no of days till present year intTemp = intTemp + monthDaysArray[i];} todaysDayNoInPresentYear = intTemp - (monthDaysArray[month-1]-day); if(firstDayOfPresentYear==6 || firstDayOfPresentYear==7){ // If first Day is Friday or Saturday then it is week // Identify the the day no on which 1st week of present year is starting firstDayNoInFirstWeekOfPresentYear = 7 - firstDayOfPresentYear+WEEK_STARTS_ON+1; // Find delay in the 1st week start after r=the year start daysLateByFirstWeekStartedAfterYearStarted = firstDayNoInFirstWeekOfPresentYear - 1; // Now week is starting from Sunday weekNo = (Integer)((todaysDayNoInPresentYear-daysLateByFirstWeekStartedAfterYearStarted)/7); // Find the day no of today intTemp = (todaysDayNoInPresentYear-daysLateByFirstWeekStartedAfterYearStarted) % 7; if(intTemp > 0){ weekNo=weekNo+1;} else{ weekNo=weekNo;} } else{ // 1st week is starting on 1st Of January firstDayNoInFirstWeekOfPresentYear=firstDayOfPresentYear; // Remove no. of days from the 1st week as week is starting from odd Sunday/Monday/Tuesday/Wednesday/Thursday intRemoveNoOfDaysFromWeek = 7-firstDayOfPresentYear + 1; // 1 added as include start day also // So one week will be added in no. of weeks weekNo = (Integer)((todaysDayNoInPresentYear-intRemoveNoOfDaysFromWeek)/7); // Find the day no of today intTemp = (todaysDayNoInPresentYear-intRemoveNoOfDaysFromWeek) % 7; weekNo = weekNo +1; // As 1st weeks days are reduced from the todays day no in the year if(intTemp > 0){ weekNo=weekNo+1;} else{ weekNo=weekNo;} // Remove the no. of days from the week 1 } strWeekNo=Integer.toString(weekNo); return strWeekNo; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 1 février 2011 Share Posté(e) 1 février 2011 Utilise la classe Calendar Calendar cal = Calendar.getInstance(); cal.setTime(maDate); int week = cal.get(Calendar.WEEK_OF_YEAR); PS : utilise les balises et [ /code] pour formater tes extraits de code dans ton post, cela le rendra plus lisible Lien vers le commentaire Partager sur d’autres sites More sharing options...
frmoul Posté(e) 1 février 2011 Auteur Share Posté(e) 1 février 2011 Bonsoir, Merci pour le tuyau pour les balises dédiées au code. Je ne connaissais pas. (débutant en programmation et sur un forum dédié info). Merci aussi pour le code. Par contre j'ai une question : maDate n'est pas un string c'est ça ? Comment convertir un string en date ? frmoul Utilise la classe Calendar Calendar cal = Calendar.getInstance(); cal.setTime(maDate); int week = cal.get(Calendar.WEEK_OF_YEAR); PS : utilise les balises et [ /code] pour formater tes extraits de code dans ton post, cela le rendra plus lisible Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 février 2011 Share Posté(e) 2 février 2011 Pour parser une chaine en date, il suffit d'utiliser SimpleDateFormat SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); // adapter le pattern au format de date attendu try { Date maDate = df.parse(maDateStr); } catch (ParseException e) { // Gerer le cas des erreurs de formatage } Lien vers le commentaire Partager sur d’autres sites More sharing options...
frmoul Posté(e) 2 février 2011 Auteur Share Posté(e) 2 février 2011 Bonsoir, Merci beaucoup pour la réponse. C'est facile à mettre en oeuvre ! Le seul problème c'est que le numéro de semaine est décalé par rapport à la norme pour la France. Je suis en train d'essayer de résoudre ce problème, mais si vous avez la solution, je veux bien la connaitre ! frmoul Pour parser une chaine en date, il suffit d'utiliser SimpleDateFormat SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); // adapter le pattern au format de date attendu try { Date maDate = df.parse(maDateStr); } catch (ParseException e) { // Gerer le cas des erreurs de formatage } Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 3 février 2011 Share Posté(e) 3 février 2011 Je suppose que tu récupères la valeur du mois via un Calendar, en faisant cal.get(Calendar.MONTH) ? La valeur retournée correspond à des constantes (Calendar.JANUARY, Calendar.FEBRUARY, ...) avec JANUARY ayant pour valeur 0, etc... Donc, c'est normal Lien vers le commentaire Partager sur d’autres sites More sharing options...
DUCKYY Posté(e) 3 février 2011 Share Posté(e) 3 février 2011 Salut frmoul, Je ne dev pas sous android mais de ce que je voit ça ressemble au c++ Qu'entends-tu par " c'est que le numéro de semaine est décalé par rapport à la norme ". Décalé de combien ? Cdlt Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 3 février 2011 Share Posté(e) 3 février 2011 J'ai répondu complètement à côté de la plaque, avec mon histoire de mois... Pas réveillé, ce matin :( Lien vers le commentaire Partager sur d’autres sites More sharing options...
frmoul Posté(e) 3 février 2011 Auteur Share Posté(e) 3 février 2011 Bonsoir, Ca arrive :) On sait jamais, ça me servira peut être ! frmoul J'ai répondu complètement à côté de la plaque, avec mon histoire de mois... Pas réveillé, ce matin :( Lien vers le commentaire Partager sur d’autres sites More sharing options...
frmoul Posté(e) 3 février 2011 Auteur Share Posté(e) 3 février 2011 Bonsoir, Ca décale d'une semaine : ça dit qu'aujourd'hui est en semaine 6 au lieu de la 5. Je sais qu'il faut mettre en semaine 1, celle contenant le 1er jeudi de l'année. Je vais essayer de mettre ça en place. frmoul Salut frmoul, Je ne dev pas sous android mais de ce que je voit ça ressemble au c++ Qu'entends-tu par " c'est que le numéro de semaine est décalé par rapport à la norme ". Décalé de combien ? Cdlt Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 3 février 2011 Share Posté(e) 3 février 2011 Le calcul du numéro de semaine de l'année varie selon les pays, et la classe Calendar est capable de gérer cela. Elle se base sur la Locale pour ce faire. Quand tu instancies un Calendar, via getInstance(), elle prend la Locale par défaut du téléphone. Quelle est la Locale du téléphone sur lequel tu fais ton test (tu peux le savoir en faisant un Locale.getDefault() ) ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
frmoul Posté(e) 4 février 2011 Auteur Share Posté(e) 4 février 2011 Bonsoir, Merci infiniment pour la réponse ! Ca va m'éviter de travailler inutilement sur un faux problème. En fait, je travail sur un emulateur. L'appli est pour un archos 5 que je n'ai pas avec moi pour développer. frmoul Le calcul du numéro de semaine de l'année varie selon les pays, et la classe Calendar est capable de gérer cela. Elle se base sur la Locale pour ce faire. Quand tu instancies un Calendar, via getInstance(), elle prend la Locale par défaut du téléphone. Quelle est la Locale du téléphone sur lequel tu fais ton test (tu peux le savoir en faisant un Locale.getDefault() ) ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.