Aller au contenu

Retourner un numéro semaine à partir d'une date


frmoul

Recommended Posts

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

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

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

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

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

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

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...